Алдыңғы мақалада QComboBox ішіндегі кейбір элементтерді пайдаланушы оларды таңдай алмайтындай етіп жасыру жолы көрсетілген. Дегенмен, егер пайдаланушы тінтуір курсорын құрамдас терезенің үстіне жылжытып, тінтуірдің дөңгелегін айналдырса, ол осы жасырын мәзір элементін таңдай алатынына назар аудармадым. Сондықтан бұл әрекетке тыйым салу керек.
Бұл тінтуір дөңгелегінің айналдыру оқиғасын осы құрамдас терезеде ұстау арқылы жасауға болады.
Бағдарламаның құрылымына байланысты мұны екі жолмен жасауға болады:
- QComboBox сыныбынан мұраға алып, wheelEvent(QWheelEvent * event ) әдісін қайта анықтаңыз.
- QObject сыныбынан мұраға алып, eventFilter(QObject obj , QEvent * event* ) әдісін қайта анықтаңыз
Өздігінен әдістің негізгі коды екі жағдайда да ұқсас болады, бұл кодтың орналасуы әртүрлі болады. Бұл реттелетін QComboBox сыныбын жасау керек пе, жоқ па, анықталады.
QComboBox мұрасымен
QComboBox ішінен мұра алған кезде біз wheelEvent(QWheelEvent * event ) әдісін қайта анықтаймыз және қай жолдар жасырылғанын тексереміз. Барлық жасырын жолдар айналдыру оқиғасы кезінде еленбейді және келесі қолжетімді көрінетін жолға өтеді.
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); }
Сүзгі параметрімен
Теңшелетін QComboBox жасағыңыз келмесе, бірақ бұл функция қажет болса, QComboBox. орнатылған терезеде сүзгіні жасауға болады (барлық виджеттер QObject ішінен мұраланады). .
Ол үшін терезенің eventFilter(QObject obj , QEvent * event* ). әдісін қайта анықтаймыз.
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); }
және осы сүзгіні мақсатты QComboBox-қа орнатыңыз
Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); ui->comboBox->installEventFilter(this); // Установим фильтр }
Здравствуйте, у меня есть вопрос по комбобоксу. Примеры из интернета со стилями не дают того, что нужно.
есть комбобокс. рядом кнопка по нажатии которой текущему элементу комбобокса устанавливается некий цвет.
например второму элементу такой цвет
но при наведении мыши цвет перекрывается цыетом селектора. даже если ему затать прозразный цвет.
как можно решить это?
Добрый день. Думаю, что нужно писать кастомный делегат. На форуме уже какие-то делегаты проскакивали, не помню только, для комбобоксов их делали или нет.
Но принцип похожий будет.
вобщем решил проблему. может пригодится кому
без наследования, переопределений , делегатов и т.д ))
не знаю насколько правильно, но всё работает.
весь фокус - несколько строк кода.
можно задать любой цвет которым будет выделяться элемент при наведении.
если цвет брать из самого элемента на котором курсор, то получется , что выделение "как бы прозрачное"
только рамочка видна.
подключение к сигналу взял из примера в документации.
как соорудить стиль из цвета - наткнулся на просторах инета.