【问题标题】:add custom widget to QTableWidget cell将自定义小部件添加到 QTableWidget 单元格
【发布时间】:2012-04-25 14:16:13
【问题描述】:

我有使用 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 );

}  

【问题讨论】:

  • 给定的代码看起来是正确的,我怀疑自定义小部件本身有问题。
  • 自定义小部件是qt设计器制作的标准小部件,它有两个按钮和两个标签。我继承自 QWidget。我不知道这有什么问题。
  • 如果您在另一个上下文中使用该小部件,它是否可见且可用?
  • “它不起作用”是什么意思?它不编译?它崩溃了?

标签: qt qtablewidget qtablewidgetitem


【解决方案1】:

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

结果是:

【讨论】:

    【解决方案2】:

    你的代码是正确的,所以我唯一想到的是你在for循环之前没有setColumnCount(1)。如果不是这种情况,您可以尝试在 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用@正确设置987654328@

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-14
      • 1970-01-01
      • 2014-04-08
      • 2015-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多