如何在内部类中处理QComboBox信号

时间:2015-10-27 16:19:41

标签: qt inner-classes

我正在使用Qt5,我创建了一个类"外部"与"内部"类。 "内部" class有两个QComboBox" cb1"和" cb2"对象作为私有变量。

原则上,第二个QComboBox" cb2"的显示文本取决于第一个QComboBox" cb1"的当前文本。事实上,通过写入适当的插槽,可以很容易地在这两者之间实现连接,使用信号和插槽。

问题是Qt不支持在内部类中编写插槽。这让我很困惑。

如何处理"内部"中的这两个QComboBox之间的连接?类?

对于某些代码,

class Outer : public QDialog
{
  Q_OBJECT
  // private variables;

  class Inner : public QWidget
  {
    QComboBox *cb1, *cb2;
    // Other variables;
    public:
    // Public methods
    public slots:
    void setIndex(int i);
  };
  // Other things;
};

内部实施

Outer::Inner::Inner()
{
  // Useless things;
  connect(cb1, SIGNAL(currentIndexChanged(int)), this, SLOT(setIndex(int)));
}

Outer::Inner::setIndex(int i)
{
  // Some stuff to retrieve the correct index in cb2;
}

2 个答案:

答案 0 :(得分:0)

在Qt 5中,任何方法都可以连接到一个信号,无论是否标记为一个插槽,所以你所描述的是一个非问题。

您需要使用现代connect语法,它才能正常工作:

connect(cb1, &QComboBox::currentIndexChanged, this, &Outer::Inner::setIndex);

当然,没有其他方法可以正常工作:qobject_cast机制不起作用,元数据会出错等等。

内部类不能是QObject。我完全没有看到它的重点。使其成为.cpp文件中的本地类,而不是内部类。

答案 1 :(得分:0)

从你的代码中我根本没有理由要求内部类。

如果您只是想避免在其他地方使用Class的可能性,我建议将其放在匿名命名空间中。

namespace {
class YourAnonymousClass{
...
}
}

class TheOtherClass {
...
}