tengo una pequeña adición.
Si se compila el código de skyhisi, entonces el combobox en Mac OS X no se ve como un cuadro combinado con casillas de verificación nativas. Puede verlo en la captura de pantalla.
probado con qt-4.8.5 y 5.1.1.
Parece que Qt dibuja estos controles por sí mismo. Nuestro equipo tiene y ha encontrado la siguiente solución por puro accidente.Usted puede subclase QStyledItemDelegate
y reimplementar paint()
esta manera:
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_);
}
entonces se puede establecer este delegado al cuadro combinado añadiendo las siguientes líneas a skyhisi de código:
SubclassOfQStyledItemDelegate *delegate = new SubclassOfQStyledItemDelegate(this);
combo->setItemDelegate(delegate);
el cuadro combinado instala con este delegado miradas de la siguiente manera:
En Windows puede haber un problema diferente: el texto de las casillas de verificación tiene un fondo o un borde punteado alrededor de un elemento:
Para cambiar este aspecto se puede añadir la siguiente línea a la pintura reemplazado justo antes de la línea QStyledItemDelegate :: pintura (painter_, refToNonConstOption, Índice_) (en el ejemplo de código esta línea se comentó) :
refToNonConstOption.state &= ~QStyle::State_HasFocus & ~QStyle::State_MouseOver;
Resultado:
Impresionante - ¡eso sin duda hace el truco! Ahora, si quiero conectar una de las casillas de verificación a una ranura (por ejemplo, hacer clic en(), para ver cuándo se hizo clic y si está marcada), ¿cómo lo haría? QStandardItem no se deriva de QObject, por lo que no puede tener señales. Miré las señales para QComboBox - la señal resaltada() se emite cuando sobrepaso una nueva casilla de verificación, pero parece que no se emite nada cuando hago clic en la casilla de verificación. Traté de agregar Qt :: ItemIsSelectable a las banderas del artículo, y luego combobox :: currentIndexChanged se emite, pero el cuadro combinado se cierra, que no es lo que quiero. ¿Idias? –
Tendrá que hacerlo en el modelo, subclase 'QAbstractListModel' e implementar' rowCount', 'data',' flags' y 'setData'. Asegúrese de que el modelo maneje la función 'Qt :: CheckStateRole'. En 'setData' puedes disparar tus señales ya que los modelos son derivados de QObject. –
Es incluso más fácil que eso :). Sin ninguna subclasificación necesaria: connect (this-> Model, SIGNAL (dataChanged (const QModelIndex &, const QModelIndex &)), esto, SLOT (slot_changed())); con: void MainWindow :: slot_changed() { std :: cout << "highlighted." << std :: endl; if (this-> Item-> checkState() == Qt :: Unchecked) { std :: cout << "¡Sin marcar!" << std :: endl; } else if (this-> Item-> checkState() == Qt :: Checked) { std :: cout << "Checked!" << std :: endl; }} –