在QT中多次继承多次调用按钮槽

时间:2015-08-18 14:37:20

标签: qt inheritance connect slot

我使用QT创建器创建Ui表单。我有一个基本表单,其中包含5个按钮(testListForm)。我通过TestStatusForm在派生类(DisplayTestResultsForm)中继承了这个基类。当我点击派生类中的按钮时,函数on_pushbutton_1_clicked()被调用三次。 下面是代码段

class TestListForm :  public TestBaseForm
{
    Q_OBJECT

private slots:
    virtual void on_pushButton_1_clicked();
    virtual void on_pushButton_2_clicked();
    virtual void on_pushButton_3_clicked();
    virtual void on_pushButton_4_clicked();
    virtual void on_pushButton_5_clicked();
}

class TestStatusForm : public TestListForm
{
    Q_OBJECT
     ....
};

class DisplayTestResultsForm : public TestStatusForm
{
    Q_OBJECT

private slots:
    void on_pushButton_1_clicked();
    void on_pushButton_2_clicked();
    void on_pushButton_3_clicked();
    void on_pushButton_4_clicked();
    void on_pushButton_5_clicked();
}

当我在DisplayTestResultsForm中调用on_pushButton_1_clicked时,我将此函数调用三次。我没有进行任何明确的连接调用,因为Ui将使用ConnectSlotByName来处理这个问题。 任何人都可以提出可能存在的问题吗?

提前致谢。

1 个答案:

答案 0 :(得分:0)

有两个错误:

  1. 私人广告位是本地的。将它们变为虚拟没有意义,因为没有派生类看到它们。您必须使广告位受保护

  2. 如果您有虚拟广告位,则只能将其声明为 moc 一次slots宏为空,仅对 moc 工具有意义。声明槽的最基类应该将它们声明为槽。 派生类的所有必须将它们声明为广告位,而只是Q_DECL_OVERRIDE重新实现。

  3. 因此:

    class TestListForm :  public TestBaseForm
    {
        Q_OBJECT
    protected slots: // protected, not private
        virtual void on_pushButton_1_clicked();
        virtual void on_pushButton_2_clicked();
        virtual void on_pushButton_3_clicked();
        virtual void on_pushButton_4_clicked();
        virtual void on_pushButton_5_clicked();
    }
    
    class TestStatusForm : public TestListForm
    {
        Q_OBJECT
    protected: // protected, overriden, no slots macro
        void on_pushButton_1_clicked() Q_DECL_OVERRIDE;
        void on_pushButton_2_clicked() Q_DECL_OVERRIDE;
        void on_pushButton_3_clicked() Q_DECL_OVERRIDE;
        void on_pushButton_4_clicked() Q_DECL_OVERRIDE;
        void on_pushButton_5_clicked() Q_DECL_OVERRIDE;
    }