Mam mały dodatek.
Jeśli ktoś skompiluje kod skyhisi to combobox na Mac OS X nie wygląda jak combobox z natywnymi polami wyboru. Możesz zobaczyć go na zrzucie .
Testowane qt 4.8.5 i 5.1.1.
Wygląda na to, że Qt samodzielnie rysuje te elementy sterujące. Nasz zespół ma znaleźć następujące obejście przez czysty wypadek.Można podklasy QStyledItemDelegate
i reimplement paint()
ten sposób:
void SubclassOfQStyledItemDelegate::paint(QPainter * painter_, const QStyleOptionViewItem & option_, const QModelIndex & index_) const
{
QStyleOptionViewItem & refToNonConstOption = const_cast<QStyleOptionViewItem &>(option_);
refToNonConstOption.showDecorationSelected = false;
//refToNonConstOption.state &= ~QStyle::State_HasFocus & ~QStyle::State_MouseOver;
QStyledItemDelegate::paint(painter_, refToNonConstOption, index_);
}
Następnie można ustawić delegata do pola kombi, dodając następujące wiersze do skyhisi Kod:
SubclassOfQStyledItemDelegate *delegate = new SubclassOfQStyledItemDelegate(this);
combo->setItemDelegate(delegate);
combobox instalowane z tego delegata wygląd w następujący sposób:
W systemie Windows może występować inny problem: tekst pola wyboru nakleił tło lub przerywaną ramkę wokół elementu:
Aby zmienić wygląd można dodać następującą linię do zastąpionej farby tylko przed linią QStyledItemDelegate :: Paint (painter_, refToNonConstOption, index_) (w próbce kodu linia ta była komentowana) :
refToNonConstOption.state &= ~QStyle::State_HasFocus & ~QStyle::State_MouseOver;
Wynik:
Awesome - to na pewno działa! Teraz jeśli chcę podłączyć jeden z sygnałów z pola wyboru do gniazda (powiedzmy klikniętego(), aby zobaczyć, kiedy kliknięto i czy jest zaznaczone), w jaki sposób mógłbym to zrobić? QStandardItem nie pochodzi z QObject, więc nie może mieć sygnałów. Spojrzałem na sygnały dla QComboBox - sygnał highlighted() jest emitowany po najechaniu kursorem na nowe pole wyboru, ale nic nie wydaje się być emitowane, gdy kliknę pole wyboru? Próbowałem dodać Qt :: ItemIsSelectable do flag elementu, a następnie combobox :: currentIndexChanged jest emitowany, ale combobox zamyka się, co nie jest tym, czego chcę. –
Będziesz musiał to zrobić w modelu, podklasę 'QAbstractListModel' i zaimplementować' rowCount', 'data',' flags' oraz 'setData'. Upewnij się, że model obsługuje rolę 'Qt :: CheckStateRole'. W 'setData' możesz strzelać sygnałami, ponieważ modele są pochodnymi QObject. –
To jeszcze łatwiejsze niż to :). Bez żadnej podklasy konieczne: connect (this-> Model, SIGNAL (dataChanged (const QModelIndex &, const QModelIndex &)), this, SLOT (slot_changed())); z: void MainWindow :: slot_changed() { std :: cout << "wyróżniony." << std :: endl; if (this-> Item-> checkState() == Qt :: Unchecked) { std :: cout << "Niezaznaczone!" << std :: endl; } else if (this-> Item-> checkState() == Qt :: Checked) { std :: cout << "Sprawdzono!" << std :: endl; } } –