【问题标题】:Qt connect signal with another class methodQt用另一个类方法连接信号
【发布时间】:2020-10-18 19:13:24
【问题描述】:

我有课

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 类中的按钮与插槽 void newFile(Ui::MainWindow * ui)Files 类连接

我试过了

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->actionExitFiles::closeFile(ui) 插槽?

【问题讨论】:

  • 停止使用基于旧/过时/慢速字符串比较且仅在运行时检查的SIGNAL()SLOT() 宏。改用现代编译时检查和更快的基于 connect() 语法的成员函数指针。
  • 类似的东西:connect(ui->actionExit, &QAction::triggered, [=]() { files->closeFile(ui); });。如果由于某种原因您坚持使用旧式语法,那么您需要一个签名与触发器的签名匹配的插槽 - 也就是说,您将无法将 Ui::MainWindow* 传递给该插槽。在这种情况下,将其传递给 Files 构造函数可能是最简单的,并将其存储在成员变量中。

标签: c++ qt signals-slots


【解决方案1】:

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

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

其次,您正在尝试使用旧的、过时的和缓慢的方法在信号和插槽之间建立连接。这种方法不仅很糟糕,因为它很慢,而且它也很糟糕,因为它只在运行时向您显示错误,即当您编译和启动您的应用程序时。如果您使用pointer to member function based connection syntax,如果您尝试连接不兼容的信号和插槽,它将拒绝编译。这样会好很多,因为您可以及早发现并修复错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-07
    • 2012-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多