问题描述
我是Qt的新手,我有一个非常简单的演示应用程序。它仅包含一个QLineEdit
小部件,当我在test()
中按 ctrl + p 时,我想调用一个函数QLineEdit
。
mainwindow.cpp
#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;
}
mainwindow.h
#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')
这是什么问题?
解决方法
您有2个误解:
-
连接指示发出信号的对象,信号,插槽所属的对象和插槽之间的链接。在您的情况下,插槽“ slot”所属的对象很明显就是这个。
-
如果要使用旧语法(SIGNAL&SLOT),则必须将“ test”声明为slot。
因此,对于上述情况,有2种可能的解决方案:
- 更改为:
connect(s,SIGNAL(activated()),this,SLOT(test()));
public slots:
void test();
- 或使用新语法:
connect(s,&QShortcut::activated,&MainWindow::test);
在两种解决方案之间,第二种更好,因为它将指示编译时错误而不是运行时静默错误。
默认情况下,快捷方式的上下文为Qt :: WindowShortcut,即,当按下组合键并且窗口具有焦点时,它将触发,如果仅当QLineEdit具有焦点时,则必须将上下文更改为Qt :: WidgetShortcut:
s->setContext(Qt::WidgetShortcut);
,
您收到错误消息,说没有此类插槽...
请注意,您尚未将test()
标记为slot
,因此在<mainwindow.h>
中,替换
void test();
作者
public slots: void test();
插槽test()
属于主窗口而不属于s
,因此使用this
代替s