ComboBox CheckBoxes?
Я пытаюсь сделать элементы в ComboBox
доступными. Я пробовал это:
http://programmingexamples.net/wiki/Qt/ModelView/ComboBoxOfCheckBoxes
где я подклассифицировал QStandardItemModel
и повторно реализовал функцию flags()
, чтобы сделать элементы проверяемыми. Затем я добавил эту модель к ComboBox
. К сожалению, флажок не отображается с элементами. Кто-нибудь может увидеть, где я ошибся?
Ответы
Ответ 1
Установили ли вы состояние проверки, а также сделали возможным их проверку?
В моем примере ниже эта строка критическая:
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
Ответ 2
У меня есть небольшое дополнение.
Если компилировать код skyhisi, то комбобокс на Mac OS X
не выглядит как combobox с встроенными флажками. Вы можете это увидеть
на скриншоте.
![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);
Компонента, установленная с этим делегатом, выглядит следующим образом:
![enter image description here]()
В Windows может возникнуть другая проблема: в тексте флажков наклеивается фон или пунктирная рамка вокруг элемента:
![enter image description here]()
Чтобы изменить этот внешний вид, можно добавить следующую строку к переопределенной краске
перед строкой QStyledItemDelegate:: paint (painter_, refToNonConstOption, index_)
(в примере кода эта строка была прокомментирована):
refToNonConstOption.state &= ~QStyle::State_HasFocus & ~QStyle::State_MouseOver;
Результат:
![enter image description here]()
Ответ 3
Вы можете попробовать это с помощью 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);
Ответ 4
Я попытался сделать этот пример в Linux Mint, но я не могу сделать флажки видимыми.
Мне пришлось реализовать класс SubclassOfQStyledItemDelegate
и установить делегат в этот флажок, как советуют Neptilo и gshep.