QMenu: come personalizzare le voci di menu di QMenu

Voglio build un controllo elenco a discesa con QPushButton e QMenu come di seguito:

QPushButton* menuBt = new QPushButton("Please select"); menuBt->setFlat(true); QMenu* menu = new QMenu(); menuBt->setMenu(menu); QWidgetAction* wa1 = new QWidgetAction(menu); QLabel* l1 = new QLabel("Option1"); wa1->setDefaultWidget(l1); menu->addAction(wa1); QWidgetAction* wa2 = new QWidgetAction(menu); QLabel* l2 = new QLabel("Option2"); wa2->setDefaultWidget(l2); menu->addAction(wa2); menu->setStyleSheet("QMenu::item {font-family: \"Arial\"; font-size: 13pt; color: #808080; border: 1px solid gray; background-color: rgb(234,234,234);}" "QMenu::item:hover {background-color: rgb(0, 0, 255);}"); menuBt->setStyleSheet("QPushButton {font-family: \"Arial\"; font-size: 13pt; color: #808080; border: 1px solid gray;padding: 1px 18px 1px 3px;min-width: 6em; background-color: rgb(234,234,234);}"); 

Ho impostato il carattere e passa il colore di sfondo alle voci del menu per setStyleSheet, ma sembra che non funzioni. Come far funzionare il colore di sfondo del carattere e del passaggio del mouse sugli elementi del menu?

Risposta:

 class QTDropDownButton : public QPushButton { Q_OBJECT public: QTDropDownButton(QString text, QWidget *parent = nullptr); void addItem(QString text); protected slots: void menuAboutToShow(); private: QMenu* menu_; }; QTDropDownButton::QTDropDownButton(QString text, QWidget *parent) : QPushButton(text, parent) { setFlat(true); menu_ = new QMenu(); setMenu(menu_); connect(menu_, SIGNAL(aboutToShow()), this, SLOT(menuAboutToShow())); setStyleSheet("font-family: Arial; font-size: 13pt; color: #808080; border: 1px solid gray; background-color: rgb(234,234,234);"); menu_->setStyleSheet("QMenu::item {font-family: Arial; font-size: 13pt; color: #808080; border: 1px solid gray; background-color: rgb(234,234,234);}" "QMenu::item:selected {background-color: rgb(0, 255, 255);}" "QLabel {font-family: Arial; font-size: 13pt;}" "QLabel:hover {background-color: rgb(0, 0, 255);}"); } void QTDropDownButton::addItem(QString text) { if(!menu_) return; QWidgetAction* wa1 = new QWidgetAction(menu_); QLabel* l1 = new QLabel(text); wa1->setDefaultWidget(l1); menu_->addAction(wa1); } void QTDropDownButton::menuAboutToShow() { if(menu_) menu_->setFixedWidth(this->width()); } 

Per impostare la famiglia di font non è necessario inserire virgolette attorno ad Arial. Credo che ciò impedisca al tuo foglio di stile di analizzare correttamente.

Una nota a margine: al momento solo il tuo menuBt è in stile, altri pulsanti assomiglieranno ai pulsanti predefiniti. Per cambiare lo stile del pulsante per tutti i pulsanti nel menu, sposta lo stile nella chiamata setStylesheet() del menu in questo modo:

 menu->setStyleSheet("QMenu::item {font-family: Arial; font-size: 13pt; color: #808080; border: 1px solid gray; background-color: rgb(234,234,234);}" + "QMenu::item:hover {background-color: rgb(0, 0, 255);}" + "QPushButton {font-family: Arial; font-size: 13pt; color: #808080; border: 1px solid gray;padding: 1px 18px 1px 3px;min-width: 6em; background-color: rgb(234,234,234);}"); 

Ma se vuoi che solo questo pulsante abbia un aspetto diverso, è corretto chiamare setStylesheet() su di esso, ma puoi omettere il selettore, in questo modo:

 menuBt->setStyleSheet("font-family: Arial; font-size: 13pt; color: #808080; border: 1px solid gray;padding: 1px 18px 1px 3px;min-width: 6em; background-color: rgb(234,234,234);");