连接子部件插槽上的信号
Posted
技术标签:
【中文标题】连接子部件插槽上的信号【英文标题】:connect signals on a child widget slot 【发布时间】:2014-06-17 07:23:35 【问题描述】:我在小部件和连接插槽中的继承方面遇到了一些问题。我创建了一个继承自QWidget
的抽象小部件。这是原型:
class WidgetParams : public QWidget
Q_OBJECT
public:
explicit WidgetParams(QWidget *parent = 0) : QWidget(parent)
virtual bool paramChanged() = 0;
protected:
bool paramsChanged;
;
然后我从WidgetParams
创建了派生类,例如WidgetParamsWindows
:
class WidgetParamsWindows : public WidgetParams
public:
explicit WidgetParamsWindows(QWidget *parent = 0);
virtual bool paramChanged()return paramsChanged;
private:
QFormLayout *layout;
QSpinBox *svertical;
QSpinBox *shorizontal;
signals:
public slots:
void changeSomeParam(int value);
;
在WidgetParamsWindows
,我有一些QSpinBox
,QPushButton
等来调整参数。
我像这样在WidetParamsWindows
中连接QSpinBox
:
connect(spinbox,SIGNAL(valueChanged(int)),this,SLOT(changeSomeParam(int));
之后,我创建了一个WidgetParamsWindows
并将其放入WidgetParams
的列表中,以便在用户点击它时显示正确的WidgetParams
。
但是当我尝试更改 QSpinBox
中的值时,没有任何变化,并且我在控制台中显示以下消息:
QObject::connect: No such slot WidgetParams::changeSomeParam(int)
不知道为什么是父Widget占据了slot,而不是WidgetParamsWindows
,你有什么想法吗?
【问题讨论】:
你能再分享一些代码(尤其是类定义)吗?您是否也将Q_OBJECT
宏添加到WidgetParamsWindows
? changeSomeParam(int)
插槽声明在哪里?
【参考方案1】:
WidgetParamsWindow
中没有Q_OBJECT
宏,所以moc
不解析槽宏,尝试在WidgetParamsWindow
中添加Q_OBJECT
【讨论】:
感谢它的作品 它是唯一没有 Q_OBJECT 宏的,但现在我在编译时遇到了“未定义的 vtable”的问题。 Q_OBJECT 必须添加一些声明才能工作?我检查了我还有其他 WidgetParams,我不会忘记这个宏以及它们的编译工作。 @user3627590,你在编译项目之前运行了qmake吗? Undefined vtable 是虚函数和多态的问题。您是否在所有继承自 WidgetParams 的类中声明 paramChanged()? 是的,就是这样。谢谢大家的回答,对于这么小的错误,我深表歉意。我知道信号和槽与 Q_OBJECT 宏一起使用,但我不知道即使宏不在这里,我们仍然可以声明它,然后如果宏未在子中声明,则父级占用槽。以上是关于连接子部件插槽上的信号的主要内容,如果未能解决你的问题,请参考以下文章
使用PyQt中的QCheckBox或QComboBox更改小部件可见性