Qt和可变函数

时间:2010-12-27 21:47:34

标签: c++ qt variadic-functions

好的,在向我讲授在C ++中使用C风格的可变参数函数之前......其他一切都要求重写Qt MOC。

我想知道的是,你是否可以在Qt对象中拥有一个带有任意数量/类型参数的“槽”。问题是我真的希望能够生成具有任意签名槽的Qt对象。由于MOC与标准预处理和模板不兼容,因此不可能采用直接方法。我想出了另一个想法:

struct funky_base : QObject
{
  Q_OBJECT
  funky_base(QObject * o = 0);

public slots:
  virtual void the_slot(...) = 0;
};

如果这是可能的话,因为你可以创建一个QObject派生对象的子类模板,只要你不在其中声明新的Qt东西,我应该能够实现一个派生的模板化类型, ...内容,并将其转换为适当的预期类型。

如果是,我将如何连接它?这会有用吗?

connect(x, SIGNAL(someSignal(int)), y, SLOT(the_slot(...)));

如果没有人尝试任何这种疯狂但不知道的事情,是的,我最终会自己尝试一下......但是我希望有人已经掌握了我可以利用的知识,然后才可能浪费我的时间。


这个问题试图找到一种方法来为模板化对象设计一个“全能”基类,它可以将Qt信号转换为静态信号,如boost :: signals2或只是基本功能。我想如果我能构建一个采用可变参数模板的插槽,我可以使用TMP重建va_args中的参数。这个问题的答案几乎就是这个问题,但是在插槽被切换到qt机制之前。关于如何制作整件事的文章系列的第一部分展示了我如何解决这部分问题:

http://crazyeddiecpp.blogspot.com/2011/01/quest-for-sane-signals-in-qt-step-1.html

那是我原来的博客位置。如果你想看到其他奇怪的sh1t,我的个人资料中会有新的。

3 个答案:

答案 0 :(得分:2)

显然人们一直认为这个问题仍然需要回答,因为我问了几个星期然后自己回答了问题,人们仍在发布他们的回答。所以我想我必须明确地回答它而不是问题本身和第一个评论:

您不能在Qt中使用可变参数函数作为信号或插槽。

我花了很多时间和精力,不仅解决了问题并分享了问题,还解释了问题是如何解决的。请考虑阅读,你甚至可以学到新的东西。

答案 1 :(得分:1)

解决这个问题的一切都会很难看,但你不应该自己做所有繁重的工作。您可以使用boost::anyboost::variant作为参数类型,然后滚动一个对象以包含您需要的参数(或使用任何/变体类型的向量)。

你也可以使用QVariant,但它不如boost :: variant那么好,当然也不像boost :: any那样灵活(价格合理)。

(或者只是用boost :: signals或trX :: variant重写Qt,因为我们现在生活在21世纪。另外,对于Qt开发人员来说,信号/插槽的状​​态并没有太多太多 - C ++ - 当Trolltech开发其信号/插槽实现时,C ++编译器通常不支持boost :: signals使用的功能。

答案 2 :(得分:-1)

请注意,“...”构造不能使用“真实”对象,因为C ++从不打算扩展“...”语法。

在您的情况下,这实际上是一个好消息,因为这意味着以下建议可能实际上对您有用,而不必担心C ++会自动破坏您的对象。

你可以做的是创建一个简单的对象,其构造函数采用“...”。它将遍历其参数,将它们转储到动态分配的数组中。然后你可以将那个单个对象传递给插槽。

假设你是一个懒惰的打字员,并称该对象为V(对于变体或变量或其他)。然后你可以调用一个像这样的V函数:

function(V("one", "two", "three", NULL));

当然,每个来电者都必须手工构建V,这可能并不完全是你所希望的。