Qt 将信号与自定义插槽匹配

Posted

技术标签:

【中文标题】Qt 将信号与自定义插槽匹配【英文标题】:Qt matching signal with custom slot 【发布时间】:2013-01-10 06:02:33 【问题描述】:

我正在尝试使用 QAction(QMenu 成员条目)打开一个新窗口。准确地说:我希望 actionAbout 信号预定义 activated 匹配 MainWindow 自定义插槽 open AboutWindow - 这就是我遇到的麻烦。

我知道我可以在源 main_window.cpp 文件中手动使用connect Qt 函数,或者只是在 Qt Creator 中单击它,但是我的自定义插槽没有显示,所以我无法选择它。也许我的槽函数声明是错误的(无效参数),这就是为什么 QtCreator 不允许我在 GUI signals & slots 中选择我的自定义槽。谁能指出我应该怎么做才能让 QtCreator 在下拉列表中显示我的自定义插槽以及连接函数调用应该是什么样子?

这是我的 main_window.h 文件内容:

#包括 #include “about_window.h” 命名空间 ui 类主窗口; 类 MainWindow : 公共 QMainWindow Q_OBJECT 民众: 显式 MainWindow(QWidget *parent = 0); 〜主窗口(); 公共插槽: 无效 openAboutWindow(); 私人的: ui::主窗口 *ui; Ui::AboutWindow *aboutWindow; ;

这是 main_window.cpp:

MainWindow::MainWindow(QWidget *parent) : QMainWindow(父), ui(新的 Ui::MainWindow) ui->setupUi(这个); 连接(actionAbout,信号(激活()),这个,SLOT(openAboutWindow(这个)); 主窗口::~主窗口() 删除用户界面; 无效 MainWindow::openAboutWindow(QWidget *parent) aboutWindow = new Ui::AboutWindow(parent); // 一定要在某个地方销毁你的窗口 aboutWindow->show();

编译器对构造函数和 openAbutWindow 大喊大叫:

../Application/main_window.cpp:在构造函数“MainWindow::MainWindow(QWidget*)”中: ../Application/main_window.cpp:9:13:错误:“actionAbout”未在此范围内声明 ../Application/main_window.cpp:9:80: 错误:在‘;’标记之前预期‘)’ ../Application/main_window.cpp:在成员函数‘void MainWindow::openAboutWindow(QWidget*)’中: ../Application/main_window.cpp:19:44:错误:无效使用不完整类型‘struct Ui::AboutWindow’ ../Application/about_window.h:7:11:错误:“struct Ui::AboutWindow”的前向声明 ../Application/main_window.cpp:20:15:错误:无效使用不完整类型‘struct Ui::AboutWindow’ ../Application/about_window.h:7:11:错误:“struct Ui::AboutWindow”的前向声明

【问题讨论】:

【参考方案1】:
../Application/main_window.cpp:9:13: error: ‘actionAbout’ was not declared in this scope

错误信息说明了一切,QAction 是在哪里定义的?应该是ui->actionAbout吗?

connect(actionAbout, SIGNAL(activated()), this, SLOT(openAboutWindow(this));

openAboutWindow() 不接受任何参数,无论this 是实例而非类型。

【讨论】:

好的,我把它改成了connect(ui->actionAbout, SIGNAL(activated()), this, SLOT(openAboutWindow(QWidget *)));,它似乎工作了,谢谢。但是openNewWindow方法仍然无效:../Application/main_window.cpp:19:44:错误:无效使用不完整类型'struct Ui::AboutWindow'是什么意思struct Ui::AboutWindow不完整以及为什么struct if这是一堂课? 这意味着编译器没有看到Ui::AboutWindow类型的声明,因为“about_window.h”只有一个前向声明。 好的,现在我知道了。我不应该创建 Ui::Class 而只是创建 Class,因为 Ui 是从 .ui 接口文件自动生成的内部 Qt 内容。谢谢。

以上是关于Qt 将信号与自定义插槽匹配的主要内容,如果未能解决你的问题,请参考以下文章

QT 插槽和信号参数

如何将 Qt 属性与自定义类一起使用?

将 Qt 与自定义 MinGW 一起使用

Qt 自定义插槽

将自定义参数传递给 Qt/C++ 中的插槽

将剪切、复制、粘贴快捷方式更改为 Qt 5 中的自定义插槽