【问题标题】:Qt: Specifying multiple connection types with QObject::connectQt:使用 QObject::connect 指定多种连接类型
【发布时间】:2014-01-10 03:16:30
【问题描述】:

我想知道是否可以指定多种连接类型。例如,我希望我的连接类型是排队连接和唯一连接。是否可以在一个语句中指定?

QObject::connect(ptrSender,SIGNAL(..),ptrReceiver,SLOT(...),Queued-and-unique)

更新:

按照海报的建议:

我尝试使用Qt::QueuedConnection | Qt::UniqueConnection,但我得到了

 `Error 1   error C2664: 'QMetaObject::Connection QObject::connect(const QObject *,const char *,const QObject *,const char *,Qt::ConnectionType)' : cannot convert parameter 5 from 'int' to 'Qt::ConnectionType'

【问题讨论】:

    标签: c++ qt qobject qtcore qt-signals


    【解决方案1】:

    是否可以在一个语句中指定?

    理论上,您的情况似乎是可能的。至少,您可以阅读有关它的文档documentation

    Qt::UniqueConnection 0x80 这是一个可以与上述任何一种连接类型组合的标志,使用按位或。当设置了 Qt::UniqueConnection 时,如果连接已经存在(即,如果相同的信号已经连接到同一对对象的相同插槽),则 QObject::connect() 将失败。这个标志是在 Qt 4.6 中引入的。

    根据上述文档,您可以编写如下内容:

    #include <QCoreApplication>
    
    int main(int argc, char **argv)
    {
        QCoreApplication coreApplication(argc, argv);
        QObject::connect(&coreApplication, SIGNAL(aboutToQuit()), &coreApplication, SLOT(quit()), static_cast<Qt::ConnectionType>(Qt::QueuedConnection | Qt::UniqueConnection));
        return coreApplication.exec();
    }
    

    【讨论】:

    • Error 1 error C2664: 'QMetaObject::Connection QObject::connect(const QObject *,const char *,const QObject *,const char *,Qt::ConnectionType)' : cannot convert parameter 5 from 'int' to 'Qt::ConnectionType' 这是我使用Qt::QueuedConnection | Qt::UniqueConnection的时候
    【解决方案2】:

    这是可能的,但 C++ 会阻止以您的方式传递 OR。

    问题是connect 接受Qt::ConnectionType 类型的参数。 对枚举中的两个值进行按位或运算会产生int 类型的值(枚举值经过整数提升 以应用按位或运算符)。这会导致您得到的编译错误:

    无法将参数 5 从“int”转换为“Qt::ConnectionType”

    (请记住,在 C++ 中,积分不会自动转换为枚举)。

    所以解决方案是将 OR 的结果转换为正确的类型,而要使用的正确转换是 static_cast

    static_cast<Qt::ConnectionType>(Qt::QueuedConnection | Qt::UniqueConnection)
    

    现在您可能会问“为什么 Qt 作者没有考虑到这一点”?好吧,事实是 Qt::UniqueConnection 已被添加到 Qt 4.6 中。

    以前,connect 只接受一个枚举值,而不是它们的 OR 组合。这就是connect 有这个签名的原因:

    connect(..., Qt::ConnectionType)
    

    不是这样的:

    connect(..., QFlags<Qt::ConnectionType>)
    connect(..., int)
    

    这反而会允许 OR。 (请注意,后两个签名还允许使用诸如 Qt::DirectConnection | Qt::QueuedConnection 之类的东西,这是没有意义的)。

    【讨论】:

    • 其实Qt::AutoCompatConnection的值为3,等于Qt::DirectConnection | Qt::QueuedConnection
    【解决方案3】:

    当然,这是可能的。因为Qt::UniqueConnection 是一个可以与任何其他连接类型组合的标志,使用按位或。

    QObject::connect(ptrSender,SIGNAL(..),ptrReceiver,SLOT(...), Qt::UniqueConnection | Qt::QueuedConnection);

    查看文档:connection type

    在 Qt v. 4.8 中,Qt::UniqueConnection 的值也为 0x80,允许将其与其他连接类型结合使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-15
      相关资源
      最近更新 更多