【问题标题】:Qt Connecting SIGNAL and SLOT in object member of MainWindowQt在MainWindow的对象成员中连接SIGNAL和SLOT
【发布时间】:2014-07-27 15:19:31
【问题描述】:

我有一个 MyClass 类:

  - private: 
      pushButton *button;
      void connectSignalAndSlot();
  - private slot: 
      void buttonAction();

我想在 MyClass 中使用 connectSignalAndSlot() 连接这些,如下所示:

  void MyClass::connectSignalAndSlot()
  {
    QObject::connect(button,SIGNAL(clicked()),this,SLOT(buttonAction()));
  }

这给了我一个错误

no matching function for call to 'QObject::connect(QPushButton*&, const char*, MyClass* const, const char*)';

如果我使用 MyClass 继承 QObject,程序会编译并启动,但随后会在我的应用程序输出窗格中显示以下问题:

QObject::connect: No such slot QObject::buttonAction() in ..\MyProject\myclass.cpp:48

我是否必须公开按钮和插槽并仅在 MainWindow 类中使用它们?有没有办法将其保留在 MyClass 级别?

感谢您的帮助!

【问题讨论】:

    标签: c++ qt signals-slots


    【解决方案1】:

    您必须让 MyClass 继承自 QObject 并在您的 MyClass 定义(头文件)中添加 Q_OBJECT 宏才能使插槽/信号工作。

    class MyClass : public QObject
    {
         Q_OBJECT
    
    public:
         ....
    };
    

    【讨论】:

    • 这允许它在应用程序输出中没有这些错误的情况下运行。谢谢!我在我的项目中使用的两个类上这样做。一个有效,另一个给出“QObject::QObject(constQObject&) 是私有的”错误。我现在正在研究它。
    • 发现问题。继承 QObject 的类不应调用复制构造函数。我将对象更改为指针,问题就解决了。再次感谢!
    【解决方案2】:

    继承QObject 是正确的方法,但您仍然缺少Qt-Meta Object 代码。你的类的头文件应该是这样的:

    #ifndef MYCLASS_H
    #define MYCLASS_H
    
    class MyClass : public QObject {
        Q_OBJECT
        // your methods, variables, slots and signals
    }
    
    #endif
    

    不要忘记创建moc 文件,最简单的方法是使用qmakeQtCreator IDE。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-22
      • 1970-01-01
      • 2013-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-05
      相关资源
      最近更新 更多