Ho una piccola aggiunta.
Se si compila il codice skyhisi, la casella combinata su Mac OS X non ha l'aspetto di una casella combinata con caselle di controllo native. Puoi vederlo sullo screenshot.
testato con qt-4.8.5 e 5.1.1.
Sembra che Qt disegna questi controlli da solo. Il nostro team ha trovato la seguente soluzione per puro caso.È possibile creare una sottoclasse QStyledItemDelegate
e reimplementare paint()
in questo modo:
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_);
}
È quindi possibile impostare questo delegato alla casella combinata aggiungendo le seguenti righe al skyhisi di codice:
SubclassOfQStyledItemDelegate *delegate = new SubclassOfQStyledItemDelegate(this);
combo->setItemDelegate(delegate);
La comboBox installato con questo delegato sguardi il seguente modo:
Su Windows può esserci un altro problema: il testo dei checkBox ha sfondo attaccato o tratteggiato attorno a un articolo:
Per cambiare questo aspetto si può aggiungere la seguente riga alla vernice override solo prima della linea QStyledItemDelegate :: vernice (painter_, refToNonConstOption, index_) (nel codice di esempio questa linea è stata commentata) :
refToNonConstOption.state &= ~QStyle::State_HasFocus & ~QStyle::State_MouseOver;
Risultato:
Impressionante: questo sicuramente fa il trucco! Ora se voglio connettere uno dei segnali del checkbox a uno slot (per esempio, cliccato su(), per vedere quando è stato cliccato e se è stato selezionato), come lo farei? QStandardItem non è derivato da QObject, quindi non può avere segnali. Ho guardato i segnali per QComboBox - il segnale evidenziato() viene emesso quando passa il mouse su una nuova casella di controllo, ma nulla sembra essere emesso quando faccio clic sulla casella di controllo? Ho provato ad aggiungere Qt :: ItemIsSelectable ai flag dell'elemento, quindi viene emesso combobox :: currentIndexChanged, ma la combobox si chiude, che non è quello che voglio.Ideas? –
Dovrai farlo nel modello, sottoclasse 'QAbstractListModel' e implementare' rowCount', 'data',' flags' e 'setData'. Assicurati che il modello gestisca il ruolo 'Qt :: CheckStateRole'. In 'setData' puoi attivare i tuoi segnali quando i modelli sono derivati da QObject. –
È ancora più semplice :). Senza alcuna sottoclasse necessaria: connect (this-> Model, SIGNAL (dataChanged (const QModelIndex &, const QModelIndex &)), this, SLOT (slot_changed())); con: void MainWindow :: slot_changed() { std :: cout << "evidenziato". << std :: endl; if (this-> Item-> checkState() == Qt :: Unchecked) { std :: cout << "Deselezionato!" << std :: endl; } else if (this-> Item-> checkState() == Qt :: Checked) { std :: cout << "Selezionato!" << std :: endl; }} –