ComboBox
のアイテムをチェック可能にしようとしています。私はこれを試しました:
http://programmingexamples.net/wiki/Qt/ModelView/ComboBoxOfCheckBoxes
ここで、QStandardItemModel
をサブクラス化し、flags()
関数を再実装して、項目をチェック可能にしました。次に、このモデルをComboBox
に追加しました。残念ながら、チェックボックスはアイテムとともに表示されません。誰かが私がどこで間違っているのか見ることができますか?
チェック状態を設定し、チェック可能にしましたか?
以下の私の例では、この行は重要です。
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
少し追加があります。
Skyhisiのコードをコンパイルすると、Mac OSXのコンボボックスはネイティブチェックボックスのあるコンボボックスのようには見えません。あなたはそれをスクリーンショットで見ることができます。
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は、次のようになります。
Windowsでは、別の問題が発生する可能性があります。チェックボックスのテキストが背景に貼り付いているか、アイテムの周囲に点線の境界線があります。
この外観を変更するには、QStyledItemDelegate :: Paint(Painter_、refToNonConstOption、index_)行の直前のオーバーライドされたペイントに次の行を追加します(コードサンプルでは、この行にコメントが付けられています)。
refToNonConstOption.state &= ~QStyle::State_HasFocus & ~QStyle::State_MouseOver;
結果:
Linux Mintでこの例を作成しようとしましたが、チェックボックスを表示できません。 Neptiloとgshepのアドバイスに従って、SubclassOfQStyledItemDelegate
クラスを実装し、デリゲートをチェックボックスに設定する必要がありました。
これは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);