【问题标题】:QLineEdit: how to handle up and down arrows?QLineEdit:如何处理上下箭头?
【发布时间】:2010-01-16 20:39:03
【问题描述】:

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

【问题讨论】:

    标签: qt


    【解决方案1】:

    您可以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 本身。然后你就不必关心 obj 参数,另外,你可以将它应用到几个 QLineEdits(假设你在对事件做出反应时使用 obj)
    • 只是补充一点,这不需要在主窗口中,它可以在任何类或QWidget中。
    【解决方案2】:

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

    【讨论】:

    • 这是个好主意。但是如何将子类化 QLineEdit 与 QtDesigner 生成的 Ui 结合起来呢?
    • 所以,为了让向上广告向下箭头工作,我需要实现一个完整的 QtDesigner 插件,其中包含大量定义如何使用“新”小部件的函数? :(
    • 除了使用事件过滤器(见我的回答),你可以为你的窗口类定义相同的方法,看看 lineedit 的向上\向下箭头键事件是否会命中它;未处理的事件沿父窗口小部件链向上传播,直到窗口小部件使用 accept() 接受它或事件过滤器消耗它。
    • @地狱之眼,除了设计器插件,您还可以在表单中添加一个QLineEdit,右键单击,并将其“提升”为派生类。对于这样的情况,它就像一个魅力。
    • @cjhuitt 非常感谢,这真的很有用!
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      在 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)
      

      【讨论】:

        猜你喜欢
        • 2017-07-13
        • 1970-01-01
        • 1970-01-01
        • 2018-05-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多