3

添付図のような QTreeView (QTreeWidget ではない) 構造を作成したい. これが QT のプロパティ エディタです。QT-4.6を使用しています

ここに画像の説明を入力

2 列目では、さまざまな条件に応じて、スピン ボックス、ドロップ ダウン、チェックボックス、テキスト編集などを使用できます。特定の列。ドキュメントから、セルにデリゲートを設定するための直接的な API がないことは明らかです (むしろ、完全なウィジェットまたは行または列で使用できます)。

4

2 に答える 2

5

やなどのすべてのQAbstractItemDelegateメソッドには、パラメータの 1 つとしてモデル インデックスがあります。そのインデックスを使用してモデル データにアクセスし、適切なデリゲート ウィジェットを作成できます。モデルを作成するときは、そのタイプを区別するために使用されるすべてのアイテムに何らかの値を設定する必要があります。createEditorpaint

例:

enum DelegateType
{
    DT_Text,
    DT_Checkbox,
    DT_Combo
}

const int MyTypeRole = Qt::UserRole + 1;

QStandardItemModel* createModel()
{
    QStandardItemModel *model = new QStandardItemModel;

    QStandardItem *item = new QStandardItem;
    item->setText("Hello!");
    item->setData(DT_Checkbox, MyTypeRole);

    model->appendRow(item);

    return model;
}

QWidget* MyDelegate::createEditor(QWidget *parent, 
                                  const QStyleOptionViewItem &option, 
                                  const QModelIndex &index) const
{
    int type = index.data(MyTypeRole).toInt();

    // this is a simplified example
    switch (type)
    {
    case DT_Text:
        return new QLinedEdit;
    case DT_Checkbox:
        return new QCheckBox;
    case DT_Combo:
        return new QComboBox;
    default:
        return QItemDelegate::createEditor(parent, option, index);
    }
}
于 2016-02-05T19:27:30.483 に答える
1

@hankこれはあなたの最後のコメントへの返信です...それに欠陥はありますか?

   MyItem* item2 = new MyItem(second);
    item2->setData(delType, **MyTypeRole**);
    if(delType == DT_Combo)
    {
        QString str1, str2, str3;
        QStringList abc ;
        abc << ("1" + str1.setNum(counter) ) << ("2" + str2.setNum(counter) )<< ( "3" + str3.setNum(counter) );
        item2->setData(abc, MyTypeRole1);
    }

QWidget* MyDelegate::createEditor(QWidget *parent, 
                                  const QStyleOptionViewItem &option, 
                                  const QModelIndex &index) const
{
    int type = index.data(MyTypeRole).toInt();

    // this is a simplified example
switch (type)
{
case DT_Text:
    return new QLinedEdit;
case DT_Combo:
{
QComboBox* cb = new QComboBox(parent);
QStringList entries - index.data(MyTypeRole1).toStringList();
cb->addItems(entries)
return cb;
}


別の item2 で、ここに来るたびに異なるカウンター変数でエントリを動的に作成します... ここでは、別のコンボ ボックスに別のエントリが表示されます。
アプローチはあなたにとってうまく見えますか?

于 2016-02-06T08:59:17.353 に答える