2011-12-07 13 views

Respuesta

13

¿Ha establecido un estado de verificación y también puede comprobarlo?

En mi ejemplo a continuación, esta línea es crítica:

item->setData(Qt::Unchecked, Qt::CheckStateRole); 

Si se omite las casillas de verificación no quede inutilizada ya que no es un cheque-estado válido para rendir.

El ejemplo muestra casillas de verificación en un cuadro combinado, una lista y una tabla, ya que tampoco pude hacer que funcionen al principio, por lo que probé diferentes vistas.

test.cpp

#include <QtGui> 

int main(int argc, char** argv) 
{ 
    QApplication app(argc, argv); 

    QStandardItemModel model(3, 1); // 3 rows, 1 col 
    for (int r = 0; r < 3; ++r) 
    { 
     QStandardItem* item = new QStandardItem(QString("Item %0").arg(r)); 

     item->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled); 
     item->setData(Qt::Unchecked, Qt::CheckStateRole); 

     model.setItem(r, 0, item); 
    } 

    QComboBox* combo = new QComboBox(); 
    combo->setModel(&model); 

    QListView* list = new QListView(); 
    list->setModel(&model); 

    QTableView* table = new QTableView(); 
    table->setModel(&model); 

    QWidget container; 
    QVBoxLayout* containerLayout = new QVBoxLayout(); 
    container.setLayout(containerLayout); 
    containerLayout->addWidget(combo); 
    containerLayout->addWidget(list); 
    containerLayout->addWidget(table); 

    container.show(); 

    return app.exec(); 
} 

test.pro

QT=core gui 
SOURCES=test.cpp 
+1

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? –

+0

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. –

+0

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; }} –

10

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.

enter image description here

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: enter image description here

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:

enter image description here

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:

enter image description here

+2

Hola, ya que no hay selección múltiple en comboBox (ejemplo ventanas) que no tiene sentido para mostrar Texto "Artículo 0".¿Hay alguna manera de deshabilitar ese texto o cambiarlo a algo así como "por favor, seleccione elementos" – Aleksandar

+0

@ Aleksandar o en lugar de "Artículo 0" que puede * no * haber sido seleccionado, deberíamos ver "Artículo1, Artículo2": a concatenación de todo el elemento seleccionado en el cuadro combinado. ¿Alguien sabe si es factible? –

+0

@yvesBaumes Creé una subclase QComboBox que actualiza el texto visible según la selección (y algunas otras características) https://gist.github.com/mistic100/c3b7f3eabc65309687153fe3e0a9a720 – Mistic

0

Puede probar esto con QListView:

QStringList values = QStringList << "check 1" << "check 2" << "check 3" << "check 4"; 

QStandardItemModel model = new QStandardItemModel; 
for (int i = 0; i < values.count(); i++) 
{ 
    QStandardItem *item = new QStandardItem(); 
    item->setText(values[i]); 
    item->setCheckable(true); 
    item->setCheckState(Qt::Unchecked); 
    model->setItem(i, item); 
} 

ui->list->setModel(model); 
0

Traté de hacer este ejemplo en Linux Mint, pero no puede hacer las casillas de verificación visible. Tuve que implementar la clase SubclassOfQStyledItemDelegate y establecer el delegado en la casilla de verificación como lo aconsejaron Neptilo y gshep.