• 8996阅读
  • 5回复

[提问]signal/slot传递自定义数据类型的问题 [复制链接]

上一主题 下一主题
离线bingcaihuang
 

只看楼主 倒序阅读 楼主  发表于: 2011-07-14
signal发送的数据类型为自定义数据类型 QList<QStandarItem*> &,typedef QList<QStandarItem*> MyList,调用qRegisterMetaType<MyList>("MyList")注册此类型,但信号函数signals:sendFun(const MyList &),槽slots:recFun(const MyList &),必须带上“const”才能正确接收到,若去掉信号与槽中的const则没法接收到该信号,请问各位大虾这是什么原因啊?
离线dbzhang800

只看该作者 1楼 发表于: 2011-07-15
回 楼主(bingcaihuang) 的帖子
不妨贴出你的测试例子。如果例子很大,在保持完整的情况下尽你最大努力进行精简
离线diyuanbo

只看该作者 2楼 发表于: 2011-07-15
回 楼主(bingcaihuang) 的帖子
QT 使用const是合理的,如果多个槽连接到该信号上,而槽执行的先后次序是不确定的,如果先前执行的槽把传递近来的参数内容改掉了,那末后面执行的槽使用的参数将会很奇怪.QT可能是想避免这样的事情发生.
离线XChinux

只看该作者 3楼 发表于: 2011-07-15
可以看看signal/slot的内部实现机制。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线dbzhang800

只看该作者 4楼 发表于: 2011-07-16
给你一个完整的测试例子(保存成main.cpp然后编译运行),因为包含3个信号与3个槽在queued与direct两种方式下的所有有效connect方式,所以代码看起来有点多(将近80行)。

如果楼主针对自己的情况去写测试程序,代码量应该可以大大减少。

  1. #include <QApplication>
  2. #include <QList>
  3. #include <QDebug>
  4. #include <QStandardItem>
  5. typedef QList<QStandardItem*> ItemsList;
  6. class TestSignal:public QObject
  7. {
  8.     Q_OBJECT
  9. public:
  10.     explicit TestSignal(QObject * parent=0) :QObject(parent)
  11.     {
  12.         m_list.append(new QStandardItem("Item1"));
  13.     }
  14.     ~TestSignal() { delete m_list[0];}
  15.     void emitslots()
  16.     {
  17.         emit sig1(m_list);
  18.         emit sig2(m_list);
  19.         emit sig3(m_list);
  20.     }
  21. signals:
  22.     void sig1(const ItemsList & l);
  23.     void sig2(ItemsList & l);
  24.     void sig3(ItemsList l);
  25. private:
  26.     ItemsList m_list;
  27. };
  28. class TestSlot:public QObject
  29. {
  30.     Q_OBJECT
  31. public:
  32.     explicit TestSlot(const QString & text, QObject * parent=0)
  33.         :QObject(parent), m_text(text)
  34.     {}
  35. public slots:
  36.     void slt1(const ItemsList & l) { output("const ItemsList &", l);}
  37.     void slt2(ItemsList & l) {output("ItemsList &", l);}
  38.     void slt3(ItemsList l) {output("ItemsList", l);}
  39. private:
  40.     void output(const QString & text, const ItemsList & l)
  41.     {
  42.         qDebug()<<QString("%1 %2 %3").arg(m_text,10).arg(text,20).arg(l[0]->text());
  43.     }
  44.     QString m_text;
  45. };
  46. #include "main.moc"
  47. int main(int argc, char *argv[])
  48. {
  49.     QApplication a(argc, argv);
  50.     TestSignal sender;
  51.     TestSlot receiver1("direct");
  52.     TestSlot receiver2("queued");
  53.     QObject::connect(&sender, SIGNAL(sig1(ItemsList)), &receiver1, SLOT(slt1(ItemsList)));
  54.     QObject::connect(&sender, SIGNAL(sig1(ItemsList)), &receiver1, SLOT(slt3(ItemsList)));
  55.     QObject::connect(&sender, SIGNAL(sig2(ItemsList&)), &receiver1, SLOT(slt2(ItemsList&)));
  56.     QObject::connect(&sender, SIGNAL(sig3(ItemsList)), &receiver1, SLOT(slt1(ItemsList)));
  57.     QObject::connect(&sender, SIGNAL(sig3(ItemsList)), &receiver1, SLOT(slt3(ItemsList)));
  58.     qRegisterMetaType<ItemsList>("ItemsList");
  59.     QObject::connect(&sender, SIGNAL(sig1(ItemsList)), &receiver2, SLOT(slt1(ItemsList)), Qt::QueuedConnection);
  60.     QObject::connect(&sender, SIGNAL(sig1(ItemsList)), &receiver2, SLOT(slt3(ItemsList)), Qt::QueuedConnection);
  61.     QObject::connect(&sender, SIGNAL(sig3(ItemsList)), &receiver2, SLOT(slt1(ItemsList)), Qt::QueuedConnection);
  62.     QObject::connect(&sender, SIGNAL(sig3(ItemsList)), &receiver2, SLOT(slt3(ItemsList)), Qt::QueuedConnection);
  63.     sender.emitslots();
  64.     return a.exec();
  65. }


离线bingcaihuang

只看该作者 5楼 发表于: 2012-07-16
回 4楼(dbzhang800) 的帖子
谢谢
快速回复
限100 字节
 
上一个 下一个