【问题标题】:Connect enterPressed() in QMainWindow to Button clicked()将 QMainWindow 中的 enterPressed() 连接到 Button clicked()
【发布时间】:2023-03-06 15:52:01
【问题描述】:

如何将主 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 它是应用程序的主窗口

标签: c++ visual-studio qt qt5


【解决方案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 之后推迟连接。
猜你喜欢
  • 1970-01-01
  • 2022-10-04
  • 1970-01-01
  • 2018-02-25
  • 1970-01-01
  • 2022-12-01
  • 2022-12-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多