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

在QT中通过多重继承多次调用按钮槽,qt,inheritance,connect,slot,Qt,Inheritance,Connect,Slot,我正在使用QtCreator创建Ui表单。我有一个包含5个按钮的基本表单(testListForm)。我通过TestStatusForm在派生类(DisplayTestResultsForm)中继承这个基类。当我单击派生类中的按钮时,_putton_1_clicked()上的函数会被调用三次。 下面是代码片段 class TestListForm : public TestBaseForm { Q_OBJECT private slots: virtual void on_p

我正在使用QtCreator创建Ui表单。我有一个包含5个按钮的基本表单(testListForm)。我通过TestStatusForm在派生类(DisplayTestResultsForm)中继承这个基类。当我单击派生类中的按钮时,_putton_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中单击按钮时,这个函数被调用了三次。我不会进行任何显式的连接调用,因为Ui将使用ConnectSlotByName处理此问题。 有人能提出问题所在吗


提前感谢。

有两个错误:

  • 私人位置是本地的。将它们虚拟化是没有意义的,因为没有派生类可以看到它们。您必须使插槽受到保护

  • 当您有虚拟插槽时,您只能向moc声明一次。
    slots
    宏为空,仅对moc工具有意义。声明插槽的最基本类应该将它们声明为插槽派生类的所有必须将它们声明为插槽,而仅作为Q\u DECL\u覆盖重新实现

  • 因此:


    它可能以某种方式连接了两次。如何检查它是否连接了两次?如果是这样,如何删除它?通过调用ConnectSlotByName()发布代码。您可以尝试添加
    Qt::UniqueConnection
    flag,但我不执行手动连接调用。如何添加此标志。嗨,库巴,谢谢你的建议。是的,虚拟插槽不应该是私有的。我的错误。我已经采纳了你的建议,现在仍然要调用两次这个函数。在moc文件中,我只能在基类中看到它一次,如下所示:moc_testlistform.cpp:40:“testlistform\0on_button_1_clicked\0”moc_testlistform.cpp:82:案例0:_t->on_button_1_clicked();中断@user3744269我认为您可能是因为没有提供足够的代码而受到了攻击,因为通过上面概述的更改,代码非常好,可以正常工作。我想我知道你在做什么。
    Ui::setupUi
    方法通过调用
    QMetaObject::connectSlotsByName
    为您设置连接。如果您在一个基类中调用
    Ui:setupUi
    ,然后在派生类中调用另一个基类,您将获得此行为。是这样吗?如果是这样的话,让这句话来提醒你,如果你不提供独立的测试用例,那你就是在自食其果,也在浪费大家的时间——你的时间。非常感谢你给我展示了这个指针。你是对的。setupUi也在派生类中被调用。在派生类中删除setupUi后,它按预期工作。Qt对我来说是非常陌生的。这些问题将是新的经验教训。如果我知道这一点,我就不会犯这个错误。再次感谢你解决了我的问题。
    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;
    }