带QStandardItemModel的QTableView:如何在编辑单元格期间执行实时更新?

时间:2017-07-23 10:33:51

标签: qt events signals qtableview qabstractitemmodel

最近,我转向了QT。这花了一些时间,但我开始找到自己的方式。但是,仍有一个问题:

我想移植一个程序,该程序在编辑表视图中的单元格时响应每个按键(QTableView with QStandardItemModel)。这个想法是在用户在表格视图的单元格中输入文本时,在单独的表单上显示和更新可能性列表。在每个键击之后,需要根据某个单元格的编辑字段中的当前文本更新列表。

使用QTableView :: installEventFilter和QEvent :: KeyPress,我可以在表格视图处于焦点时按下每个按键,但单元格文本/模型仅在编辑后更新,禁止实时更新列表。

模型的dataChanged信号仅在编辑完成后发出,而不是在用户输入时发出。

关于如何解决这个问题的任何想法? 我应该使用QItemDelegate吗? 或者QLineEdit应该以某种方式连接到一个单元格,并且这可以在没有明显的情况下完成,所以用户似乎仍然直接在单元格内工作?

感谢您的帮助

2 个答案:

答案 0 :(得分:0)

它可以工作(也就是说,直到主窗口调整大小......)

也许不是最好的解决方案,但至少我找到了一种让它发挥作用的方法。 我把插槽放在包含主窗口的源文件中,因为这是我一直习惯的(C ++ Builder)......

GLiveEdit.H - 子类QStyledItemDelegate

#ifndef GLIVEEDIT_H
#define GLIVEEDIT_H

#include <QStyledItemDelegate>


class GLiveEdit : public QStyledItemDelegate {

  public:
    GLiveEdit (QObject *_ParentWindow = 0, const char *_Slot = 0);

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


  protected:
    mutable QLineEdit *Editor;
    const char *Slot;
    QWidget *ParentWindow;
};

#endif // GLIVEEDIT_H

<强> GLiveEdit.CPP

#include "gliveedit.h"
#include <QLineEdit>

GLiveEdit::GLiveEdit (QObject *_ParentWindow, const char *_Slot)
  : QStyledItemDelegate (_ParentWindow)

{
  Editor = 0;
  Slot = _Slot;
  ParentWindow = (QWidget *) _ParentWindow;
}


QWidget *GLiveEdit::createEditor(QWidget *parent,
                                    const QStyleOptionViewItem &option,
                                    const QModelIndex &index) const
{
  Editor = (QLineEdit *) QStyledItemDelegate::createEditor (parent, option, index);
  connect (Editor, SIGNAL (textChanged (const QString &)), ParentWindow, Slot);
  return Editor;
}

MainWindow.CPP - 安装Subclassed QStyledItemDelegate(&#34; GLiveEdit&#34;)

void MainWindow::SetUp()

{
  // Instantiate subclassed QStyledItemDelegate "GLiveEdit" as "Live"
  // Also pass the slot "OnEditChanged" that is to be called during editing
  Live = new GLiveEdit (this, SLOT (OnEditChanged (const QString &)));

  // Tell the table about the instantiated subclassed delegate "Live"
  ui->tvOverview->setItemDelegate (Live);
}


void MainWindow::OnEditChanged (const QString &NewText)

{
  // NewText contains the up to date text that is currently being edited
}

任何关于拥有它的想法在窗口调整后都可以使用吗? 不幸的是,在QMainWindow :: resizeEvent中调用SetUp函数似乎不起作用。

另外,我想QTableView会从内存中删除项代理吗?

编辑:如果在编辑过程中调整窗口大小,则项目委托仅停止工作...如果编辑首先完成,它将保持正常运行。

答案 1 :(得分:0)

有效!调整大小后的问题是由于我的一个错误:-)(位于源代码的其他地方) 任何改进建议仍然欢迎!