2012-04-25 182 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

相关问题