CheckBoxes的ComboBox?

Dav*_*ria 16 qt qt4

我正在尝试将物品制成ComboBox可检查的物品.我试过这个:

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

我在哪里子类化QStandardItemModel并重新实现了flags()使项目可检查的功能.然后我把这个模型添加到了ComboBox.不幸的是,项目不会出现复选框.任何人都可以看到我哪里出错了?

Sil*_*ker 18

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

在下面的示例中,此行非常重要:

item->setData(Qt::Unchecked, Qt::CheckStateRole);
Run Code Online (Sandbox Code Playgroud)

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

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

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();
}
Run Code Online (Sandbox Code Playgroud)

test.pro

QT=core gui
SOURCES=test.cpp
Run Code Online (Sandbox Code Playgroud)

  • 太棒了 - 这当然有把戏!现在,如果我想将其中一个复选框的信号连接到一个插槽(例如,点击(),以查看它何时被点击以及是否被选中),我该怎么做?QStandardItem不是从QObject派生的,因此它不能有信号.我查看了QComboBox的信号 - 当我将鼠标悬停在一个新的复选框上时,会发出突出显示的()信号,但是当我点击复选框时似乎没有发出任何信号?我尝试将Qt :: ItemIsSelectable添加到项目的标志中,然后发出combobox :: currentIndexChanged,但组合框关闭,这不是我想要的.想要? (2认同)
  • 它甚至比那更容易:)。无需任何子类化: connect(this-&gt;Model, SIGNAL(dataChanged ( const QModelIndex&amp;, const QModelIndex&amp;)), this, SLOT(slot_changed())); 与: void MainWindow::slot_changed() { std::cout &lt;&lt;“突出显示。” &lt;&lt; std::endl; if(this-&gt;Item-&gt;checkState() == Qt::Unchecked) { std::cout &lt;&lt; "未选中!" &lt;&lt; std::endl; } else if(this-&gt;Item-&gt;checkState() == Qt::Checked) { std::cout &lt;&lt; "已检查!" &lt;&lt; std::endl; } } (2认同)

gsh*_*hep 14

我有一点补充.

如果编译skyhisi的代码然后Mac OS X上的组合框看起来不像组合框与本机复选框.你可以在截图上看到它.

在此输入图像描述

用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_);
}
Run Code Online (Sandbox Code Playgroud)

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

SubclassOfQStyledItemDelegate *delegate = new SubclassOfQStyledItemDelegate(this);
combo->setItemDelegate(delegate);
Run Code Online (Sandbox Code Playgroud)

随此委托安装的comboBox具有以下方式: 在此输入图像描述

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

在此输入图像描述

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

refToNonConstOption.state &= ~QStyle::State_HasFocus & ~QStyle::State_MouseOver;
Run Code Online (Sandbox Code Playgroud)

结果:

在此输入图像描述

  • 嗨,因为在comboBox(windows示例)中有多个选择,所以显示"Item 0"文本没有意义.有没有办法禁用该文本或将其更改为"请,选择项目" (2认同)