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

问题描述 投票:0回答:1

我正在使用 QT Creator 来创建 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 来处理此问题。 谁能建议可能是什么问题?

提前致谢。

qt inheritance slot
1个回答
0
投票

有两个错误:

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

  2. 当您拥有虚拟插槽时,您只能将它们声明为 moc once

    slots
    宏是空的,仅对 moc 工具有意义。声明槽的最基本的类应该将它们声明为槽。 所有派生类必须将它们声明为槽,而仅仅作为
    Q_DECL_OVERRIDE
    重新实现。

因此:

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;
}
© www.soinside.com 2019 - 2024. All rights reserved.