ComboBox из CheckBoxes? - PullRequest
       3

ComboBox из CheckBoxes?

14 голосов
/ 08 декабря 2011

Я пытаюсь сделать элементы в ComboBox проверяемыми.Я попробовал это:

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

, где я вложил в подкласс QStandardItemModel и повторно реализовал функцию flags(), чтобы сделать элементы проверяемымиЗатем я добавил эту модель в ComboBox.К сожалению, флажок не отображается с элементами.Кто-нибудь может увидеть, где я ошибся?

Ответы [ 4 ]

15 голосов
/ 08 декабря 2011

Вы установили состояние проверки, а также сделали их проверяемыми?

В моем примере ниже эта строка критична:

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
13 голосов
/ 21 ноября 2013

У меня есть небольшое дополнение.

Если кто-то компилирует код 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 может возникнуть другая проблема: текст флажков имеет прикрепленный фон или пунктирную рамку вокруг элемента:

enter image description here

Чтобы изменить этот внешний вид, можно добавить следующую строку к переопределенной краске просто перед строкой QStyledItemDelegate :: paint (painter_, refToNonConstOption, index_) (в примере кода эта строка была прокомментирована):

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

Результат:

enter image description here

1 голос
/ 22 апреля 2016

Я пытался создать этот пример на Linux Mint, но не могу сделать флажки видимыми.Мне пришлось реализовать класс SubclassOfQStyledItemDelegate и установить для делегата флажок, как советовали Neptilo и gshep.

0 голосов
/ 28 октября 2014

Вы можете попробовать это с 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...