In einem früheren Artikel wurde gezeigt, wie einige Elemente in einer QComboBox ausgeblendet werden, sodass der Benutzer sie nicht auswählen kann. Ich habe jedoch nicht darauf geachtet, dass der Benutzer diesen versteckten Menüpunkt auswählen kann, wenn er den Mauszeiger über die Combobox selbst bewegt und das Mausrad dreht. Daher sollte dieses Verhalten verboten werden.
Dies kann durch Abfangen des Scroll-Ereignisses des Mausrads innerhalb dieser Combobox erfolgen.
Je nach Aufbau des Programms kann dies auf zwei Arten erfolgen:
- Erben Sie von der QComboBox -Klasse und überschreiben Sie die wheelEvent(QWheelEvent * event ). -Methode
- Erben Sie von der Klasse QObject und überschreiben Sie die Methode eventFilter(QObject obj , QEvent * event* )
An sich ist der Hauptcode der Methode in beiden Fällen ähnlich, die Position dieses Codes ist unterschiedlich. Dies hängt davon ab, ob Sie eine benutzerdefinierte QComboBox-Klasse erstellen müssen oder nicht.
Mit Vererbung von QComboBox
Beim Erben von QComboBox überschreiben wir die Methode wheelEvent(QWheelEvent * event ) und prüfen, welche Zeilen ausgeblendet sind. Alle verdeckten Zeilen werden während des Scroll-Ereignisses ignoriert und springen zur nächsten verfügbaren sichtbaren Zeile.
void CustomComboBox::wheelEvent(QWheelEvent* event) { int row = this->currentIndex(); int count = this->count(); QListView* dropdownList = static_cast<QListView*>(this->view()); do { event->angleDelta().y() < 0 ? ++row : --row; if (row >= 0 && row < count && !dropdownList->isRowHidden(row)) { this->setCurrentIndex(row); return; } } while (row >= 0 && row < count); }
Mit Filtereinstellung
Wenn Sie keine benutzerdefinierte QComboBox erstellen möchten, aber diese Funktionalität benötigen, können Sie einen Filter für das Fenster erstellen (alle Widgets erben von QObject ), in dem Ihre QComboBox. festgelegt ist .
Dazu überschreiben wir die Methode eventFilter(QObject obj , QEvent * event* ). des Fensters.
bool Widget::eventFilter(QObject* obj, QEvent *event) { if (event->type() == QEvent::Wheel) { QWheelEvent *wheelEvent = static_cast<QWheelEvent*>(event); QComboBox* comboBox = static_cast<QComboBox*>(obj); int row = comboBox->currentIndex(); int count = comboBox->count(); QListView* dropdownList = static_cast<QListView*>(comboBox->view()); do { wheelEvent->angleDelta().y() < 0 ? ++row : --row; if (row >= 0 && row < count && !dropdownList->isRowHidden(row)) { comboBox->setCurrentIndex(row); return true; } } while (row >= 0 && row < count); return true; } return QObject::eventFilter(obj, event); }
und setzen Sie diesen Filter auf die Ziel-QComboBox
Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); ui->comboBox->installEventFilter(this); // Установим фильтр }
Здравствуйте, у меня есть вопрос по комбобоксу. Примеры из интернета со стилями не дают того, что нужно.
есть комбобокс. рядом кнопка по нажатии которой текущему элементу комбобокса устанавливается некий цвет.
например второму элементу такой цвет
но при наведении мыши цвет перекрывается цыетом селектора. даже если ему затать прозразный цвет.
как можно решить это?
Добрый день. Думаю, что нужно писать кастомный делегат. На форуме уже какие-то делегаты проскакивали, не помню только, для комбобоксов их делали или нет.
Но принцип похожий будет.
вобщем решил проблему. может пригодится кому
без наследования, переопределений , делегатов и т.д ))
не знаю насколько правильно, но всё работает.
весь фокус - несколько строк кода.
можно задать любой цвет которым будет выделяться элемент при наведении.
если цвет брать из самого элемента на котором курсор, то получется , что выделение "как бы прозрачное"
только рамочка видна.
подключение к сигналу взял из примера в документации.
как соорудить стиль из цвета - наткнулся на просторах инета.