使用Qt Designer Form Classes扩展我自己的自定义小部件时,防止重复的自动连接

时间:2017-06-20 13:52:49

标签: c++ qt

我有一个自定义容器小部件(我们称之为WidgetA),它包含一些小部件,以及使用QDesignerContainerExtension向Qt Designer公开的容器。然后我有另一个小部件(WidgetB),它扩展了WidgetA,在WidgetA中向容器添加了许多小部件。这两个小部件都有一个与之关联的.ui表单文件。

此配置适用于我的目的,但有一个例外。 Qt的connectSlotsByName函数在两个类的setupUI函数中运行,导致Widget A的小部件连接到它们的插槽两次。我的代码看起来像这样:

// WidgetA.h
namespace Ui {
    class WidgetA;
}

class WidgetA : public QWidget
{
    Q_OBJECT

public:
    explicit WidgetA( QWidget* parent = 0 ) :
        QWidget( parent ),
        ui( new Ui::WidgetA )
    {
        ui->setupUi( this ); // <-- Connects widgets in WidgetA.
    }

    // ...

private:
    Ui::WidgetA* ui;
}

// ...
// WidgetB.h
namespace Ui {
    class WidgetB;
}

class WidgetB : public WidgetA
{
    Q_OBJECT

public:
    explicit WidgetB( QWidget* parent = 0 ) :
        WidgetA( parent ), // <-- WidgetA’s constructor, calls setupUi resulting in WidgetA’s widgets being connected.
        ui( new Ui::WidgetB )
    {
        ui->setupUi( this ); // <-- Connects widgets in WidgetA and WidgetB, resulting in duplicate connection of WidgetA’s widgets.
    }

    // ...

private:
    ui::WidgetB* ui;
}

我知道Qt :: UniqueConnection标志,但由于ui的头类是自动生成的,所以我无法控制连接的性质。如何避免这种双重连接?

1 个答案:

答案 0 :(得分:0)

答案很简单:

不要使用connectSignalsByName功能,不要创建类似on_object_signal()的方法,这只是在任何软件中遇到麻烦。

如果有问题的小部件应该通过它的UI连接,你可以使用Qt Designer拖放信号连接器,但根据我个人的经验处理用Qt编写的大型代码库是你不应该使用而是手动使用connect()函数,因为它的错误少得多。