将自定义委托与从 QTableView 派生的类一起使用

Posted

技术标签:

【中文标题】将自定义委托与从 QTableView 派生的类一起使用【英文标题】:Using custom delegate with the class derived from QTableView 【发布时间】:2014-06-24 14:29:04 【问题描述】:

我从 QTableView 派生了一个类。我已经将 Widget QTableView 提升为 Qt creator 中的派生类。并尝试在派生类中实现自定义委托,这似乎不起作用。但是当我将 QTableView Widget 降级为 QTableView 时。自定义委托有效。

我试图浏览文档,但找不到任何解决方案。我错过了什么吗?

更新:

我检查了 Paint() 方法被调用但没有 createEditor 方法。

您可以在下面找到代码。

Geometry.cpp(从 QTableView 派生的类的构造函数)

Geometry::Geometry(QWidget *parent) :
    QTableView(parent)

   this->setAcceptDrops(true);
   this->setSelectionMode(QAbstractItemView::ExtendedSelection);
   this->setContextMenuPolicy(Qt::CustomContextMenu);
   this->setEditTriggers(QAbstractItemView::NoEditTriggers);

   grpModel = new QStandardItemModel();

   grpModel->setHorizontalHeaderItem(0,new QStandardItem ("Geometry part"));
   grpModel->setHorizontalHeaderItem(0,new QStandardItem ("Surface property"));
   this->setModel(grpModel);

MyDelegate.cpp(自定义委托的定义)

QWidget* MyDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option,     const QModelIndex &index) const

    //Definition
    this method is not called


void MyDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
 

   //definition



void MyDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const

 //definition


 void MyDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
 
    editor->setGeometry(option.rect);
 

 void MyDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,      const QModelIndex &index) const
 
       QStyledItemDelegate::paint(painter,option,index); // This method is called
 

主窗口.cpp

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
     
 ui->setupUi(this);

 ui->tableGeometry->setModel(grpModel); //tabelGeometry is promoted to Geometry
 comboDelegate = new MyDelegate();
 ui->tableGeometry->setItemDelegate(comboDelegate);
 

【问题讨论】:

您应该澄清究竟是什么不起作用。显示一些 SSCCE。 您确定您的项目是可编辑的吗?请参阅setFlags 方法。 @DmitrySazonov:你说得对,我在 QTabelView 派生类的构造函数中将标志设置为 NoEditTriggers。 不要在问题中添加“已解决”。如果您有解决方案,请将其发布为您自己问题的答案。如果问题无法再重现,请删除该问题。事实上,我们有一个“已解决”的问题,但看不到解决方案。 请按照 Kuba Ober 的说明发布解决方案。 【参考方案1】:

解决办法是这样的

我已从 Geometry.cpp 类的构造函数中删除了 this->setEditTriggers(QAbstractItemView::NoEditTriggers);。我的理解是,委托已附加但未调用,因为项目必须可编辑才能调用委托。

【讨论】:

以上是关于将自定义委托与从 QTableView 派生的类一起使用的主要内容,如果未能解决你的问题,请参考以下文章

QTableView 上的 PySide 委托,带有文本和刻度

为啥委托方法需要将自定义类托管对象上下文的内容保存在委托类托管对象上下文中?

如何将自定义控件派生的 TabItem 添加到 WPF 中的 TabControl?

底层模型更改时如何在 QTableView 中禁用自动滚动到顶部?

如何将自定义的 Delegate 转成 Func 委托?

Qt 在 QTableView 中设置自定义小部件