Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QPushButton未显示在QTableView上(使用QItemDelegate过程)_C++_Qt_Qt5_Qtableview_Qitemdelegate - Fatal编程技术网

C++ QPushButton未显示在QTableView上(使用QItemDelegate过程)

C++ QPushButton未显示在QTableView上(使用QItemDelegate过程),c++,qt,qt5,qtableview,qitemdelegate,C++,Qt,Qt5,Qtableview,Qitemdelegate,我有一个4行4列的QTableView。我试图将QPushButton仅添加到最后一列的所有单元格中,第一行除外。当我运行代码时,我可以看到表格,但当我单击4列的每个单元格时,我会看到QPushButton,但它会立即消失。只有QPushButton上的单词“Detail”仍然可见。我还在第一排看到QPushButton。有什么想法吗 #include "dialog.h" #include "ui_dialog.h" #include "buttoncolumndelegate.h" Dia

我有一个4行4列的QTableView。我试图将QPushButton仅添加到最后一列的所有单元格中,第一行除外。当我运行代码时,我可以看到表格,但当我单击4列的每个单元格时,我会看到QPushButton,但它会立即消失。只有QPushButton上的单词“Detail”仍然可见。我还在第一排看到QPushButton。有什么想法吗

#include "dialog.h"
#include "ui_dialog.h"
#include "buttoncolumndelegate.h"

Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);

    mybutton = new ButtonColumnDelegate(this);
    mModel = new QStandardItemModel(4,4,this);
    ui->tableView->setModel(mModel);
    ui->tableView->setItemDelegateForColumn(3, mybutton);

}

Dialog::~Dialog()
{
    delete ui;
}                     
这是按钮ColumnDelegate.cpp

#include "buttoncolumndelegate.h"

ButtonColumnDelegate::ButtonColumnDelegate(QObject *parent) :
    QItemDelegate(parent)
{

}
QWidget * ButtonColumnDelegate::createEditor(QWidget *parent,
            const QStyleOptionViewItem &option,
            const QModelIndex &index) const
{
    QPushButton *detail = new QPushButton("Detail",parent);
    detail->setText("Detail");
    (void) option;
    (void) index;
    return detail;
}

void ButtonColumnDelegate::setEditorData(QWidget *editor,
                                     const QModelIndex &index) const
{
    QPushButton *detail = qobject_cast<QPushButton *>(editor);
    detail->setProperty("Detail", "Detail");
    detail->setText("Detail");
    (void) index;
}

void ButtonColumnDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
                                    const QModelIndex &index) const
{
    QPushButton *detail = qobject_cast<QPushButton *>(editor);
    model->setData(index, detail->property("Detail"));

}

void ButtonColumnDelegate::updateEditorGeometry(QWidget *editor,
                              const QStyleOptionViewItem &option,
                              const QModelIndex &index) const
{
    editor->setGeometry(option.rect);
    (void) index;  
#include "dialog.h"
#include "ui_dialog.h"
#include "buttoncolumndelegate.h"

Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);

    mybutton = new ButtonColumnDelegate(this);
    mModel = new QStandardItemModel(4,4,this);
    ui->tableView->setModel(mModel);
    ui->tableView->setItemDelegateForColumn(3, mybutton);

}

Dialog::~Dialog()
{
    delete ui;
}                     
createEditor()
仅在您想要编辑小部件时调用,而如果您想要在不编辑值时显示按钮,则必须覆盖
paint()
方法

#include "dialog.h"
#include "ui_dialog.h"
#include "buttoncolumndelegate.h"

Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);

    mybutton = new ButtonColumnDelegate(this);
    mModel = new QStandardItemModel(4,4,this);
    ui->tableView->setModel(mModel);
    ui->tableView->setItemDelegateForColumn(3, mybutton);

}

Dialog::~Dialog()
{
    delete ui;
}                     
void ButtonColumnDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    QPushButton button(index.data().toString());
    button.setGeometry(option.rect);
    painter->save();
    painter->translate(option.rect.topLeft());
    button.render(painter);
    painter->restore();
}

谢谢,它很管用!:)让我再问你一个问题,我想让按钮可以点击。我该怎么做?我想打开另一个窗口,在那里我有另一个表(这个表需要创建,它可以被认为是类似于您的屏幕截图)。我基本上是在创建一个嵌套的表。@Emanuele我不明白,请解释清楚。另外,如果我的答案对您有帮助,请不要忘记将其标记为正确,如果您不知道如何操作,请检查以下链接:是的,我将答案标记为正确,因为它正是我所要查找的,谢谢Eyllanesc!:)我还有一个问题:我正试图点击我刚刚创建的“详细信息”按钮,因为我需要打开另一个对话框窗口。如何使按钮可单击?“当我单击4列的每个单元格时”。你是说第四列的每个单元格?你点击按钮了吗?
#include "dialog.h"
#include "ui_dialog.h"
#include "buttoncolumndelegate.h"

Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);

    mybutton = new ButtonColumnDelegate(this);
    mModel = new QStandardItemModel(4,4,this);
    ui->tableView->setModel(mModel);
    ui->tableView->setItemDelegateForColumn(3, mybutton);

}

Dialog::~Dialog()
{
    delete ui;
}