Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用Qt Designer表单类扩展我自己的自定义小部件时防止重复的自动连接_C++_Qt - Fatal编程技术网

C++ 使用Qt Designer表单类扩展我自己的自定义小部件时防止重复的自动连接

C++ 使用Qt Designer表单类扩展我自己的自定义小部件时防止重复的自动连接,c++,qt,C++,Qt,我有一个定制的容器小部件(我们称之为WidgetA),它由一些小部件组成,还有一个容器,它使用。然后我有另一个小部件(WidgetB),它扩展了WidgetA,在WidgetA的容器中添加了许多小部件。这两个小部件都有一个与之关联的.ui表单文件 这个配置对我来说很好,只有一个例外。Qt的函数在这两个类的setupUI函数中运行,导致小部件A的小部件连接到它们的插槽两次。我的代码如下所示: // WidgetA.h namespace Ui { class WidgetA; } cla

我有一个定制的容器小部件(我们称之为WidgetA),它由一些小部件组成,还有一个容器,它使用。然后我有另一个小部件(WidgetB),它扩展了WidgetA,在WidgetA的容器中添加了许多小部件。这两个小部件都有一个与之关联的.ui表单文件

这个配置对我来说很好,只有一个例外。Qt的函数在这两个类的setupUI函数中运行,导致小部件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;
}
//WidgetA.h
名称空间用户界面{
WidgetA类;
}
WidgetA类:公共QWidget
{
Q_对象
公众:
显式WidgetA(QWidget*parent=0):
QWidget(母公司),
ui(新ui::WidgetA)
{
ui->setupUi(这个);//答案很简单:

不要使用connectSignalsByName功能,不要创建像on_object_signal()这样的方法,这只会给任何软件带来麻烦

如果讨论中的小部件应该通过其UI连接,则可以使用Qt Designer拖放信号连接器,但根据我个人处理用Qt编写的庞大代码库的经验,您不应该使用它,而应该手动使用connect()函数,因为它不太容易出错。

答案很简单:

不要使用connectSignalsByName功能,不要创建像on_object_signal()这样的方法,这只会给任何软件带来麻烦

如果讨论中的小部件应该通过其UI连接,那么可以使用Qt Designer拖放信号连接器,但根据我个人处理用Qt编写的庞大代码库的经验,您不应该使用它,而应该手动使用connect()函数,因为它不太容易出错