[英]Can't bind signal to slot in my Qt application
我是 Qt 的新手,我有一个非常简单的演示应用程序。 它只包含一个QLineEdit
小部件,当我在QLineEdit
中按ctrl+p时,我想调用一个 function test()
。
下面是相关文件。
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include <QShortcut>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
QShortcut *s = new QShortcut(QKeySequence("Ctrl+P"), ui->lineEdit);
connect(s, SIGNAL(activated()), ui->lineEdit, SLOT(test()));
}
MainWindow::~MainWindow()
{
delete ui;
}
void test(){
qDebug() << "test() triggered!" << endl;
}
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
void test();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
当我编译应用程序时,我在调试面板中看到以下消息并且应用程序没有响应ctrl+p 。
QObject::connect: No such slot QLineEdit::test() in ..\ShortcutIssueDemo\mainwindow.cpp:13
QObject::connect: (receiver name: 'lineEdit')
它有什么问题?
你有两个误解:
连接表示发出信号的object、信号、槽所属的object和槽之间的链接。 在您的情况下,很明显插槽“插槽”所属的 object 就是这个。
如果要使用旧语法(SIGNAL & SLOT),则必须将“test”声明为 slot。
因此,对于上述情况,有两种可能的解决方案:
connect(s, SIGNAL(activated()), this, SLOT(test()));
public slots:
void test();
connect(s, &QShortcut::activated, this, &MainWindow::test);
在这两种解决方案之间,第二种更好,因为它会在编译时指示错误,而不是在运行时指示静默错误。
默认情况下,快捷方式的上下文是 Qt::WindowShortcut,也就是说,当按下组合键并且 window 有焦点时,它将触发,如果只有当 QLineEdit 有焦点时,则必须将上下文更改为 ZE8801102A40AD89DDFCFSWidget :
s->setContext(Qt::WidgetShortcut);
您收到了错误消息,说没有这样的插槽...
请注意,您没有将test()
标记为slot
,因此在<mainwindow.h>
中,替换
void test();
经过
public slots: void test();
并且插槽test()
属于主窗口而不是s
,因此使用this
而不是s
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.