2012-04-25 73 views
3

我有自定義小部件使用qt設計器,我想將它添加到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 2012-04-25 14:27:36

+0

自定義小部件是在qt設計器中製作的標準小部件,它有兩個按鈕和兩個標籤。我從QWidget繼承。我不知道那可能是錯的。 – user152508 2012-04-25 14:30:36

+0

如果您在其他上下文中使用小部件,它是否可見並且可用? – Chris 2012-04-25 15:57:00

回答

3

如果你想定製的小部件添加到您可以使用QItemDelegate表格單元格設置。

創建您自己的委託類並從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(「行一個」和「線三條」)你應該設置這樣的:QTableWidgetItem* item = new QTableWidgetItem("");,否則你不需要這些行,你CustomWdg正確地與setCellWidget

相關問題