将 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
吗? QDialog
s 有default buttons,我认为QDialog
s 更适合用户输入一些数据并按回车键。那么,在这里使用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 中的插槽
parted 分区及LVM挂载(BASE ON SUSE Enterpres 11 SP4)