Qt将信号与另一个类方法连接

Qt connect signal with another class method

本文关键字:类方法 连接 另一个 信号 Qt      更新时间:2023-10-16

I have class

class Files : public QWidget
{
Q_OBJECT
public:
Files();
~Files();
public slots:
void saveFile(Ui::MainWindow * ui);
void openFile(Ui::MainWindow * ui);
void checkOpenFile(Ui::MainWindow * ui);
void newFile(Ui::MainWindow * ui);
void checkNewFile(Ui::MainWindow * ui);
void closeFile(Ui::MainWindow * ui);
};

我想将放置在 MainWindow 类中的按钮与Files类的插槽void newFile(Ui::MainWindow * ui)连接

我试过了

files = new Files;
//files->newFile(ui); works as it should
connect(ui->actionExit, SIGNAL(triggered()), files, SLOT(closeFile(ui)));

我有消息:

QObject::connect: No such slot Files::closeFile(ui) in ../qt/src/core/mainwindow.cpp:16
QObject::connect:  (sender name:   'actionExit')

我应该如何以正确的方式将ui->actionExit与插槽连接Files::closeFile(ui)

首先,您正在尝试连接彼此不兼容的信号和插槽:closeFile插槽需要Ui::MainWindow *类型的参数,但您尝试连接到它的信号没有参数。

你真的需要closeFile来获取指向Ui::MainWindow的指针吗?您可以让这个插槽和其他插槽不带参数吗?如果你真的需要从Files内的方法/插槽内部访问Ui::MainWindow,你可以创建一个setter来传递指针Ui::MainWindowFiles,并在插槽中使用该指针,这些插槽本身不会接受任何参数。

其次,您正在尝试使用旧的、过时的和缓慢的方法来设置信号和插槽之间的连接。这种方法不仅很糟糕,因为它很慢,而且也很糟糕,因为它只在运行时(即编译和启动应用程序时(向您显示错误。如果使用基于成员函数的指针连接语法,则在尝试连接不兼容的信号和插槽时,它将拒绝编译。这种方式要好得多,因为您可以及早查看并修复错误。