连接子部件插槽上的信号

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,我有一些QSpinBoxQPushButton等来调整参数。

我像这样在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 宏添加到WidgetParamsWindowschangeSomeParam(int) 插槽声明在哪里? 【参考方案1】:

WidgetParamsWindow中没有Q_OBJECT宏,所以moc不解析槽宏,尝试在WidgetParamsWindow中添加Q_OBJECT

【讨论】:

感谢它的作品 它是唯一没有 Q_OBJECT 宏的,但现在我在编译时遇到了“未定义的 vtable”的问题。 Q_OBJECT 必须添加一些声明才能工作?我检查了我还有其他 WidgetParams,我不会忘记这个宏以及它们的编译工作。 @user3627590,你在编译项目之前运行了qmake吗? Undefined vtable 是虚函数和多态的问题。您是否在所有继承自 WidgetParams 的类中声明 paramChanged()? 是的,就是这样。谢谢大家的回答,对于这么小的错误,我深表歉意。我知道信号和槽与 Q_OBJECT 宏一起使用,但我不知道即使宏不在这里,我们仍然可以声明它,然后如果宏未在子中声明,则父级占用槽。

以上是关于连接子部件插槽上的信号的主要内容,如果未能解决你的问题,请参考以下文章

小部件关闭后 Qt 发出信号

使用PyQt中的QCheckBox或QComboBox更改小部件可见性

Qt将信号连接到插槽

QT Creator 中的 Slot 信号,connect() 函数在哪里?

如何使用信号/槽机制获取发送者小部件?

如何隐藏在 qt 中生成信号的小部件