将自定义小部件添加到 QTableWidget 单元格

5
我是一名有用的助手,可以为您翻译文本。
我有一个使用Qt Designer制作的自定义小部件,我想将它添加到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 );

}  

给定的代码看起来正确,我怀疑自定义小部件本身出了问题。 - Chris
自定义小部件是在Qt Designer中制作的标准小部件,它有两个按钮和两个标签。它继承自QWidget。我不知道可能出了什么问题。 - user152508
如果您在另一个上下文中使用该小部件,它是否可见和可用? - Chris
“它不起作用”是什么意思?它无法编译吗?它崩溃了吗? - koan
2个回答

9

如果您想将自定义小部件添加到表格单元格中,可以使用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;
}

and result is:(结果如下):

Result


7

你的代码是正确的,所以我能想到的唯一问题就是在 for 循环之前你没有执行 setColumnCount(1)。如果不是这个问题,你可以在循环之前设置行和列的数量,而不是在循环中逐行插入:

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("line one" 和 "line three"),你应该这样设置它:QTableWidgetItem* item = new QTableWidgetItem("");,否则你不需要那些行,你的 CustomWdg 已经通过 setCellWidget 正确设置了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接