【问题标题】:Qt: bring base class method into slots in derived classQt:将基类方法带入派生类的槽中
【发布时间】:2024-01-16 16:26:01
【问题描述】:

我有一个派生自 QWidget 和模型类的类。根据我的阅读,我不能让模型类从 QObject 派生。

class PageWidget : public QWidget,
        public MyModelClass
{
...
};

模型类MyModelClass已经有设置属性的方法,例如setWidth(bool)。看来我不能直接将这些方法用作插槽。如果我声明:

QObject::connect(button, SIGNAl(dataChanged(bool)), this, SLOT(setWidth(bool)));

Qt 在运行时抱怨没有插槽 setWidth(bool)。我必须手动将每个方法添加到 PageWidget 中,它只是调用了与 MyModelClass 相同的方法。

有什么方法可以在不重新声明每个方法的情况下将基本方法引入槽?

【问题讨论】:

  • 是的:不要使用多重继承 :-) 你确定你需要它吗?尤其是如果您有方法名称冲突,您将面临很多痛苦。

标签: qt signals-slots qobject


【解决方案1】:

QMetaObject(允许你使用槽的 Qt 部分)和多重继承不能混用。您创建“通过”插槽的解决方案是解决它的一种方法。但是,如果您不需要进行多重继承,我不会这样做。仅从外观上看,PageWidget 从 Widget 和 Model 派生似乎很奇怪。让它包含模型可能更有意义。

【讨论】:

  • 这是正确的。从两个都是 QObjects 的类中乘以继承是不可能的。