2012-04-25 9 views
3

私はqt designerで作られたカスタムウィジェットを持っています。それをQTableWidgetセルに追加したいと思います。 しかし、それは動作しません。ここで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); 

} 
+0

、私は何かが習慣と間違っている疑いがあるでしょうウィジェット自体。 – Chris

+0

カスタムウィジェットはqtデザイナーで作成された標準のウィジェットで、2つのボタンと2つのラベルがあります。私はQWidgetを継承しています。私は何が間違っているのか分からない。 – user152508

+0

別のコンテキストでウィジェットを使用している場合は、それを表示して使用できますか? – Chris

答えて

3

に設定され、そうでなければ、これらの行を必要としない、QTableWidgetItem* item = new QTableWidgetItem("");:あなたはこのようにそれを設定する必要があります。

独自の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; 
}; 

次に、このメソッドを使用してテーブルの代理人を自分で設定します。

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; 
} 

し、その結果を次のとおりです。与えられたコードが正しく見える

Result

3

あなたのコードが正しいので、私の心に来る唯一のことは、あなたが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」)を必要とする場合あなたは表のセルにカスタムウィジェットを追加したい場合は、QItemDelegateを使用することができ、あなたのCustomWdgが正しくsetCellWidget

関連する問題