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

How to handle QComboBox signals in inner classes

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

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

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

如何处理 "inner" class 中这两个 QComboBoxes 之间的连接?

对于某些代码,

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;
}

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

您需要使用现代 connect 语法,它会很好地工作:

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

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

内部 class 不能是 QObject。我完全看不到它的意义。将其设为 .cpp 文件中的本地 class 而不是内部 class.

从你的代码中,我根本不明白为什么你需要一个内部 class。

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

namespace {
class YourAnonymousClass{
...
}
}

class TheOtherClass {
...
}