CheckBoxes的ComboBox?

时间:2011-12-07 21:23:44

标签: qt qt4

我正在尝试将ComboBox中的项目设为可检查项。我试过这个:

http://programmingexamples.net/wiki/Qt/ModelView/ComboBoxOfCheckBoxes

我将QStandardItemModel子类化并重新实现flags()函数以使项目可检查。然后我将此模型添加到ComboBox。不幸的是,项目不会出现复选框。谁能看到我出错的地方?

4 个答案:

答案 0 :(得分:15)

您是否设置了检查状态并使其可以检查?

在下面的示例中,这一行至关重要:

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

如果省略,则不会呈现复选框,因为没有要呈现的有效检查状态。

该示例显示了组合框,列表和表格中的复选框,因为我最初也无法使其工作,所以我尝试了不同的视图。

<强> 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 :(得分:13)

我有一点补充。

如果编译skyhisi的代码然后编译Mac OS X上的组合框 看起来不像组合框与原生复选框。你可以看到 截图。

enter image description here

使用qt-4.8.5和5.1.1进行测试。

似乎Qt自己绘制了这些控件。我们的团队有 纯粹的意外发现了以下的解决方法。您可以通过这种方式继承QStyledItemDelegate并重新实现paint()

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_);
}

然后,您可以通过在skyhisi的代码中添加以下行来将此委托设置为组合框:

SubclassOfQStyledItemDelegate *delegate = new SubclassOfQStyledItemDelegate(this);
combo->setItemDelegate(delegate);

使用此委托安装的comboBox看起来如下: enter image description here

在Windows上可能存在不同的问题:checkBoxes的文本在项目周围粘贴了背景或虚线边框:

enter image description here

要更改此外观,可以将以下行添加到覆盖的绘制中 行QStyledItemDelegate :: paint(painter_,refToNonConstOption,index_)之前 (在代码示例中,此行已注释):

refToNonConstOption.state &= ~QStyle::State_HasFocus & ~QStyle::State_MouseOver;

结果:

enter image description here

答案 2 :(得分:1)

我尝试在Linux Mint上创建此示例,但我无法使复选框可见。 我必须实现SubclassOfQStyledItemDelegate类并将委托设置为Neptilo和gshep建议的复选框。

答案 3 :(得分:0)

您可以使用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);