• 12331阅读
  • 6回复

Qt::UniqueConnection 的使用方法? [复制链接]

上一主题 下一主题
离线woniu600
 

只看楼主 倒序阅读 楼主  发表于: 2014-09-25
如果 connect 连接时使用 Qt::UniqueConnection 后, 怎么再如何确定 DirectConnection 或QueuedConnection 的连接flag?

然后   有没有办法 在 使用 flag的时候 ,用上 lambda表达式 ? 下面的代码是报错的.

connect(ui->pushButton_4,&QPushButton::clicked,
          [=](){
      qprint<<"ssss";
    } ,Qt::UniqueConnection);


Any help?
离线roywillow

只看该作者 1楼 发表于: 2014-09-25
connect新语法能使用匿名函数,这个是肯定的
你是说希望既是UniqueConnection又是DirectConnection之类的?用或运算连接起来应该就可以了吧,比如Qt::UniqueConnection | Qt::DirectConnection 作为参数
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线woniu600

只看该作者 2楼 发表于: 2014-09-26
回 roywillow 的帖子
roywillow:connect新语法能使用匿名函数,这个是肯定的
你是说希望既是UniqueConnection又是DirectConnection之类的?用或运算连接起来应该就可以了吧,比如Qt::UniqueConnection | Qt::DirectConnection 作为参数 (2014-09-25 22:17) 

使用匿名表达式的时候就用不了连接选项了啊。编译通过不了。

使用两个连接flag编译会报错。。。不论是qt5语法还是老语法
离线roywillow

只看该作者 3楼 发表于: 2014-09-26
回 woniu600 的帖子
woniu600:使用匿名表达式的时候就用不了连接选项了啊。编译通过不了。
使用两个连接flag编译会报错。。。不论是qt5语法还是老语法 (2014-09-26 09:40) 

好吧……匿名函数确实没有最后一个参数了……
QMetaObject::Connection QObject::connect(const QObject * sender, PointerToMemberFunction signal, Functor functor)
不过文档中确实说明了,UniqueConnection是可以与AutoConnection、DirectConnection、QueuedConnection、BlockingQueuedConnection使用OR运算结合使用的
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线dbzhang800

只看该作者 4楼 发表于: 2014-09-26
刚试了一下(Qt5.3.1),这个东西对lambda无效,不过用于普通的信号槽时没有问题的。完整的测试程序如下

  1. #include <QApplication>
  2. #include <QPushButton>
  3. class Test : public QObject
  4. {
  5.     Q_OBJECT
  6. public:
  7.     Test(){}
  8. public slots:
  9.     void slt(){qDebug("Hello from normal slot");}
  10. };
  11. #include "main.moc"
  12. int main(int argc, char *argv[])
  13. {
  14.     QApplication a(argc, argv);
  15.     QPushButton w("Hello button");
  16.     auto type = static_cast<Qt::ConnectionType>(Qt::UniqueConnection|Qt::QueuedConnection);
  17.     auto func = [=] () {qDebug("Hello from lambda slot");};
  18.     w.connect(&w, &QPushButton::clicked, &a, func, type);
  19.     w.connect(&w, &QPushButton::clicked, &a, func, type);
  20.     Test t;
  21.     w.connect(&w, SIGNAL(clicked()), &t, SLOT(slt()), type);
  22.     w.connect(&w, SIGNAL(clicked()), &t, SLOT(slt()), type);
  23.     w.show();
  24.     return a.exec();
  25. }

1条评分金钱+5
woniu600 金钱 +5 thx :) 2014-09-26
离线dbzhang800

只看该作者 5楼 发表于: 2014-09-26
另外,

    w.connect(&w, SIGNAL(clicked()), &t, SLOT(slt()), type);
    w.connect(&w, SIGNAL(clicked()), &t, SLOT(slt()), type);

换成
    w.connect(&w, &QPushButton::clicked, &t, &Test::slt, type);
    w.connect(&w, &QPushButton::clicked, &t, &Test::slt, type);

也工作正常。

当然二者混合是不行的,比如

    w.connect(&w, SIGNAL(clicked()), &t, SLOT(slt()), type);
    w.connect(&w, &QPushButton::clicked, &t, &Test::slt, type);
离线woniu600

只看该作者 6楼 发表于: 2014-09-26
thx
:)
快速回复
限100 字节
 
上一个 下一个