【问题标题】:Qt connect doesn't worksQt 连接不起作用
【发布时间】:2013-10-11 12:58:54
【问题描述】:

我有一个 C++ 库。该库使用发布-订阅者模式。

namespace mylib {
typedef unsigned MyLibType;
class IEvent
{
    virutal ~IEvent() {}

    virtual void event1() = 0;
     virtual void event2(MyLibType) = 0;
};

class IMyClass
{
public:
    virtual ~IMyClass() {}

    // operations
};

} // mylib

// C interface
int CreateMyClass( mylib::IMyClass** class, mylib::IEvent* listener );

// implementation
class MyClass : public IMyClass { // ...

当创建 MyClass 时,使用一个线程来生成一些事件。

现在在 Qt 上:

class QtMyApplication : public QMainWindow, public mylib::IEvent
{
    Q_OBJECT

public:
    explicit QtMyApplication(QWidget *parent = 0);
    ~QtMyApplication();

signals:
    void MyLibEvent1();
    void MyLibEvent2(mylib::MyLibType);

private slots:
    void OnMyLibEvent1();
    void OnMyLibEvent2(mylib::MyLibType);

private: // IEvent interface
    void event1()
    {
        emit MyLibEvent1();
    }

    void event2(mylib::MyLibType i)
    {
        emit OnMyLibEvent2( i );
    }

private:
    Ui::QtMyApplication* ui;
    mylib::IMyLib mMyLib;
};

// implementation
QtMyApplication::QtMyApplication( QWidget *parent ) :
    QMainWindow(parent),
    ui(new Ui::QtMyApplication)
{
    ui->setupUi( this );

    CreateMyLib( &mMyLib, this );

    connect( this, SIGNAL(MyLibEvent1()),
             this, SLOT(OnMyLibEvent1()) );
    connect( this, SIGNAL(MyLibEvent2(mylib::MyLibType)),
             this, SLOT(OnMyLibEvent2(mylib::MyLibType)) );
}

当我运行应用程序时,在 QtMyApplication 中调用了 event2(),但从不调用 OnMyLibEvent2,而是调用了 event1(),并且也调用了 OnMyLibEvent1。 我错了什么?参数参数有问题吗?

编辑 1

我发现连接对参数有一些限制......因为如果我在MyLibEvent2(int) 中更改MyLibEvent2(mylib::MyLibType) 一切正常......

【问题讨论】:

  • 可能 event2() 永远不会被调用?
  • event2 被执行并调用emit MyLibEvet2(i)OnMyLibEvet2 从未被调用
  • 另一个奇怪的是Qt在输出窗口上打印:pc 0x400 in read in psymtab, but not in symtab.
  • 我偶然发现的一件事是connect 不检查大小写或拼写。所以要特别确保没有大小写不匹配或缺少字符。编译器不会抱怨,但你的函数不会被调用
  • IEvent 的一个参数是 typedef。可能是这个问题吗?

标签: c++ qt4 qt5 publish-subscribe


【解决方案1】:

您需要将您的数据类型注册到 QTs 元类型系统以使其工作:

qRegisterMetaType<mylib::MyLibType>();

QTs 元类型系统不知道 typedef,因此不知道如何传输 mylib::MyLibType。 如果您也需要Q_DECLARE_METATYPE(mylib::MyLibType),我并不完全确定,如果您没有成功,请尝试。

如果您使用 QT5 的新连接语法,那么它也可以在没有任何额外工作的情况下工作。

connect( this, &QtMyApplication::MyLibEvent2,
         this, &QtMyApplication::OnMyLibEvent2);

问题在于旧的连接语法是围绕元数据系统和字符串比较工作的,而且相当脆弱。如果您决定将您的插槽更新为void OnMyLibEvent2(::mylib::MyLibType),它也将不起作用

【讨论】:

    猜你喜欢
    • 2012-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-05
    • 2015-12-02
    • 2017-08-12
    相关资源
    最近更新 更多