无法将信号绑定到我的Qt应用程序中的插槽 mainwindow.cpp mainwindow.h

问题描述

我是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种可能的解决方案:

  1. 更改为:
connect(s,SIGNAL(activated()),this,SLOT(test()));
public slots:
    void test();
  1. 或使用新语法:
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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...