将 QMainWindow 中的 enterPressed() 连接到 Button clicked()

Posted

技术标签:

【中文标题】将 QMainWindow 中的 enterPressed() 连接到 Button clicked()【英文标题】:Connect enterPressed() in QMainWindow to Button clicked() 【发布时间】:2017-04-05 08:28:20 【问题描述】:

如何将主 GUI 窗口中的 key enterPressed() 事件连接到特定按钮(也在主 GUI 中)?

用例:

用户启动应用程序,输入一些数据并按下回车按钮,将绕过一个“开始”按钮被点击。

我的想法:

connect(this, SIGNAL(returnPressed()), ui.btn_Start, SLOT(clicked()));

class ClassA : QMainWindow

    Q_OBJECT
    // ...

    private:
        Ui::ClassAClass ui;
    // ...
;

【问题讨论】:

您确定您的用例需要QMainWindow 吗? QDialogs 有default buttons,我认为QDialogs 更适合用户输入一些数据并按回车键。那么,在这里使用QMainWindow 有什么理由吗? @Mike 它是应用程序的主窗口 【参考方案1】:

您可以将信号连接到其他信号:

connect(this, &MainWindow::returnPressed, ui.btn_Start, &QPushButton::released);

就是这样。该信号被转发到QPushButton 发出它的实例信号,因此任何连接到它的信号都将被调用。此外(你谈论事件)QMainWindow::keyPressEvent 你重新实现:

class MainWindow : public QMainWindow

//...
signals:
    void returnPressed() const;

protected:
    void keyPressEvent(QKeyEvent *event);
;

void MainWindow::keyReleaseEvent(QKeyEvent *event)

    if(event->key() == Qt::Key_Return)
        emit returnPressed();
    QMainWindow::keyReleaseEvent(event);

【讨论】:

问题是:QMainWindow has no member "returnPressed" 错误:“插槽需要的参数比信号提供的更多”,我认为你有一个错字:returnedPressed vs returnPressed 它有效,谢谢。输入 keyPressEvent 与 keyReleaseEvent,不要忘记将连接的 Button 信号从单击更改为释放! @leon22 keyReleaseEvent 不是拼写错误,而是意图。您通常应该使用释放而不是向下/按下/单击。原因是在事情发生后(按键按下)而不是在用户完成操作时(按键被释放,鼠标按钮被释放等)发出信号。特别是在单击鼠标时,您可能希望通过将单击的鼠标拖离(从按钮上)来取消操作,但如果您的信号被绑定为“按下”,则这是不可能的,因为它会立即发出。 @leon22 有多种选择。最简单的方法是仅在显示消息框后进行连接。其他选项是在消息框期间暂时阻止信号。另一个是使用焦点(仅当 MainWindow 是焦点小部件 qApp->focusWidget() 时才这样做)。我会推荐第一个 - 在初始 QMessageBox 之后推迟连接。

以上是关于将 QMainWindow 中的 enterPressed() 连接到 Button clicked()的主要内容,如果未能解决你的问题,请参考以下文章

将 QMainWindow 中的 enterPressed() 连接到 Button clicked()

如何将 Qdialog 中的信号连接到 QMainwindow 中的插槽

windows 10 enterprize LTSC

parted 分区及LVM挂载(BASE ON SUSE Enterpres 11 SP4)

如何将 QMainWindow 调整大小事件传递给 QMainWindow 中包含的 QGLWidget?

使用PyQt(QMainWindow)使用多重继承进行子类化时python中的MRO [重复]