5

qtデザイナーで作成したカスタムウィジェットがあり、QTableWidgetセルに追加したいと思います。しかし、それは機能しません。

コードは次のとおりです。

int nRows =10;
for(int row = 0; row < nRows;row++;)

{
    QTableWidgetItem* item = new QTableWidgetItem();
    CustomWdg* wdg=new CustomWdg( );

    mTableWdg->insertRow( row );
    mTableWdg->setItem(row, 0, item);
    mTableWdg->setCellWidget( row, 0, wdg );

}  
4

2 に答える 2

9

カスタムウィジェットをテーブルセルに追加する場合は、QItemDelegateを使用できます。

独自のDelegateクラスを作成し、QItemDelegateから継承します。

class MyDelegate : public QItemDelegate
{
    public:
    CChoicePathDelegate (QObject *parent = 0);
    QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const; //delegate editor (your custom widget)
    void setEditorData(QWidget *editor, const QModelIndex &index) const;
    void setModelData(QWidget *editor, QAbstractItemModel *model,
    const QModelIndex &index) const; //transfer editor data to model
    void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option,
    const QModelIndex &index) const;
};

次に、このメソッドを使用してTableのデリゲートを独自に設定します。

setItemDelegate(QAbstractItemDelegate *)
setItemDelegateForColumn(int, QAbstractItemDelegate *)
setItemDelegateForRow(int, QAbstractItemDelegate *)

私はこのコードを試しました:

#include "widget.h"
#include "ui_widget.h"
#include <QPushButton>
#include <QLabel>
#include <QHBoxLayout>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    QHBoxLayout *l = new QHBoxLayout();
    l->addWidget((new QPushButton("I`m in cell")));
    l->addWidget((new QLabel("Test label")));

    QWidget *w = new QWidget();

    w->setLayout(l);

    ui->tableWidget->setCellWidget(1,1, w);
}

Widget::~Widget()
{
    delete ui;
}

結果は次のとおりです。

結果

于 2016-02-15T20:09:16.953 に答える
6

あなたのコードは正しいので、私の頭に浮かぶ唯一のことは、ループのsetColumnCount(1)前にあなたがしなかったということです。forそうでない場合は、forループに行ごとに挿入する代わりに、そのループの前に行と列の数を設定してみてください。

int nRows =10;
mTableWdg->setRowCount(nRows);
mTableWdg->setColumnCount(1);
for(int row = 0; row < nRows;row++;)

{
    //QTableWidgetItem* item = new QTableWidgetItem();// line one
    CustomWdg* wdg=new CustomWdg( );
    //mTableWdg->setItem(row, 0, item);// line three
    mTableWdg->setCellWidget( row, 0, wdg );

}  

本当に必要な場合item(「1行目」と「3行目」)は、次のように設定する必要QTableWidgetItem* item = new QTableWidgetItem("");があります。それ以外の場合、これらの行は必要ありません。CustomWdgsetCellWidget

于 2013-09-13T08:54:49.507 に答える