我有一个自定义容器小部件(我们称之为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的头类是自动生成的,所以我无法控制连接的性质。如何避免这种双重连接?
答案 0 :(得分:0)
答案很简单:
不要使用connectSignalsByName功能,不要创建类似on_object_signal()的方法,这只是在任何软件中遇到麻烦。
如果有问题的小部件应该通过它的UI连接,你可以使用Qt Designer拖放信号连接器,但根据我个人的经验处理用Qt编写的大型代码库是你不应该使用而是手动使用connect()函数,因为它的错误少得多。