web-dev-qa-db-ja.com

チェックボックスのコンボボックス?

ComboBoxのアイテムをチェック可能にしようとしています。私はこれを試しました:

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

ここで、QStandardItemModelをサブクラス化し、flags()関数を再実装して、項目をチェック可能にしました。次に、このモデルをComboBoxに追加しました。残念ながら、チェックボックスはアイテムとともに表示されません。誰かが私がどこで間違っているのか見ることができますか?

16
David Doria

チェック状態を設定し、チェック可能にしましたか?

以下の私の例では、この行は重要です。

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
18
Silas Parker

少し追加があります。

Skyhisiのコードをコンパイルすると、Mac OSXのコンボボックスはネイティブチェックボックスのあるコンボボックスのようには見えません。あなたはそれをスクリーンショットで見ることができます。

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

14
gshep

Linux Mintでこの例を作成しようとしましたが、チェックボックスを表示できません。 Neptiloとgshepのアドバイスに従って、SubclassOfQStyledItemDelegateクラスを実装し、デリゲートをチェックボックスに設定する必要がありました。

1
perimeno

これは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);
0
Sergio Cabral