【发布时间】:2010-01-16 20:39:03
【问题描述】:
我在基于Qt 的应用程序中有一个控制台输入,它是一个QLineEdit,所有Ui 都是通过QtDesigner 设计的。是否有任何简单的方法来处理向上和向下箭头以实现输入历史记录? 'go to slot' 只显示returnProcessed 信号,我看不到处理上下箭头:(
【问题讨论】:
标签: qt
我在基于Qt 的应用程序中有一个控制台输入,它是一个QLineEdit,所有Ui 都是通过QtDesigner 设计的。是否有任何简单的方法来处理向上和向下箭头以实现输入历史记录? 'go to slot' 只显示returnProcessed 信号,我看不到处理上下箭头:(
【问题讨论】:
标签: qt
您可以install event filter 并在您的窗口类中观看您的行编辑事件。下面是一个例子:
在你的窗口类上声明事件处理方法:
class MainWindow : public QMainWindow {
Q_OBJECT
...
protected:
void changeEvent(QEvent *e);
...
};
窗口构造函数
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
...
ui->lineEdit->installEventFilter(this);
}
事件处理程序实现:
bool MainWindow::eventFilter(QObject* obj, QEvent *event)
{
if (obj == ui->lineEdit)
{
if (event->type() == QEvent::KeyPress)
{
QKeyEvent* keyEvent = static_cast<QKeyEvent*>(event);
if (keyEvent->key() == Qt::Key_Up)
{
qDebug() << "lineEdit -> Qt::Key_Up";
return true;
}
else if(keyEvent->key() == Qt::Key_Down)
{
qDebug() << "lineEdit -> Qt::Key_Down";
return true;
}
}
return false;
}
return QMainWindow::eventFilter(obj, event);
}
希望这会有所帮助,问候
【讨论】:
您可以继承 QLineEdit 并重新实现虚拟 keyPressEvent 方法来处理您的特殊键。
void MyLineEdit::keyPressEvent(QKeyEvent *event)
{
if(event->key() == Qt::Key_Up){
// move back in history
}
else if(event->key() == Qt::Key_Down){
// move forward in history
}
else{
// default handler for event
QLineEdit::keyPressEvent(event);
}
}
【讨论】:
我也遇到了同样的问题,但是我在其他论坛发现你需要setFocus,例如:
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
...
ui->lineEdit->installEventFilter(this);
this->setFocus();
}
它对我有用。
参考: http://www.qtforum.org/article/28240/how-to-get-arrow-keys.html
【讨论】:
在 PyQt 中对我来说这不起作用,
class MainWidget(QtGui.QMainWindow):
def __init__(self):
QtGui.QMainWindow.__init__(self)
self.setupUi()
self->installEventFilter(self)
但这行得通,
class MainWidget(QtGui.QMainWindow):
def __init__(self):
QtGui.QMainWindow.__init__(self)
self.setupUi()
QtGui.QApplication.instance().installEventFilter(self)
【讨论】: