QLineEdit:如何处理上下箭头?

时间:2010-01-16 20:39:04

标签: qt

我在基于Qt的应用程序中有一个控制台输入,它是QLineEdit,所有Ui都是通过QtDesigner设计的。是否有任何简单的方法来处理向上和向下箭头以实现输入历史记录? '转到插槽'只显示returnProcessed信号,我无法看到处理上下箭头:(

4 个答案:

答案 0 :(得分:15)

您可以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);
}

希望这有帮助,尊重

答案 1 :(得分:6)

您可以继承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);
    }
}

答案 2 :(得分:1)

我遇到了同样的问题,但我在其他论坛中发现你需要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

答案 3 :(得分:0)

对我来说,在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)