最近,我转向了QT。这花了一些时间,但我开始找到自己的方式。但是,仍有一个问题:
我想移植一个程序,该程序在编辑表视图中的单元格时响应每个按键(QTableView with QStandardItemModel)。这个想法是在用户在表格视图的单元格中输入文本时,在单独的表单上显示和更新可能性列表。在每个键击之后,需要根据某个单元格的编辑字段中的当前文本更新列表。
使用QTableView :: installEventFilter和QEvent :: KeyPress,我可以在表格视图处于焦点时按下每个按键,但单元格文本/模型仅在编辑后更新,禁止实时更新列表。
模型的dataChanged信号仅在编辑完成后发出,而不是在用户输入时发出。
关于如何解决这个问题的任何想法? 我应该使用QItemDelegate吗? 或者QLineEdit应该以某种方式连接到一个单元格,并且这可以在没有明显的情况下完成,所以用户似乎仍然直接在单元格内工作?
感谢您的帮助
答案 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)
有效!调整大小后的问题是由于我的一个错误:-)(位于源代码的其他地方) 任何改进建议仍然欢迎!