我正在尝试将物品制成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)
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)
结果:
归档时间: |
|
查看次数: |
20202 次 |
最近记录: |