gpt4 book ai didi

c++ - 是否可以在 Qt Designer 中使用依赖注入(inject)(对于 .ui 文件)?

转载 作者:太空狗 更新时间:2023-10-29 21:10:25 28 4
gpt4 key购买 nike

我们正在使用 Visual Studio 2015 和 Qt Designer 为我们的 UI(通过 Form/.ui 文件)使用 C++(和 Qt)进行开发。

我们现在需要在我们的 UI 元素之间共享一些公共(public)数据(例如最近使用的路径等),我想通过依赖注入(inject)来做到这一点(即在构造期间为 UI 提供对公共(public)对象的引用)例如(ab)使用单例模式。

有人遇到过(并解决过)类似的问题吗?有没有明智的方法来解决这个问题?

更新(详述):
例如,我有一个自定义的 FooWidget,我希望在我的 FooDialog.ui 表单文件中使用它。

// My custom Widget
class FooWidget : public QWidget {
Q_OBJECT
public:
FooWidget(QWidget* parent);
//...
}

// The FooDialog class (scaffolding created by Qt Designer)
class FooDialog : public QDialog {
Q_OBJECT
public:
FooDialog(QWidget* parent) : QDialog(parent), ui (new Ui::FooDialog()) {
ui->setupUp(this);
//...
}

private:
Ui::FooDialog* ui;
}

// The Ui::FooDialog class autogenerated(!) by Qt Designer
// I cannot (must not) change this code, as it will be regenerated every time
class Ui_FooDialog {
public:
FooWidget* widget;

void setupUi(QWidget *fooDialog) {
//...
widget = new FooWidget(fooDialog);
//...
}
}
namespace Ui { class ScannerStatus: public Ui_ScannerStatus {}; }

我想为 FooWidget 提供一个公共(public)数据对象(例如,我的所有 Ui 类共享的文本大小和颜色),但我不能在构造函数中这样做(因为自动生成的 Ui_FooDialog 处理 FooWidget 作为通用 QWidget,它只需要/在构造函数中采用一个 QWidget* parent - 我无法提供指向我共享的 TextColourAndSize< 的指针或引用 对象。

我知道我可以在 FooDialog 中创建第二个 ui->widget->setupTextColourAndSize(...) 步骤(在初始 ui-> setupUi(this)) 提供了通用数据对象,但是有两个 init() 类型的函数似乎是一种相当糟糕的代码味道(一个已经够糟糕了)。

最佳答案

FooWidget 需要两个构造函数和一个依赖项的 setter :

explicit FooWidget(QObject *parent = nullptr) : QWidget(parent), … {

}
FooWidget(Dependency *dep, QObject *parent = nullptr) : FooWidget(parent) {
setDependency(dep);
}
void setDependency(Dependency *dep) {

}

然后在构建小部件后设置依赖项:

FooDialog(Dependency *dep, …) … {
setupUi(this);
ui->fooWidget->setDependency(dep);
}

这可以是自动化的:父小部件可以有一个属性来保存指向依赖项的指针,子小部件可以自动找到它:

FooDialog(Dependency *, …) : … {
setProperty("dependency", dep);
setupUi(this);
}

FooWidget(QWidget *parent) : … {
auto *dep = parent() ? parent()->property("dependency").value<Dependency*>() : nullptr;
if (dep) setDependency(dep);
}

如果 Dependency 派生自 QObject,这将毫不费力地工作。否则,您需要在合适的头文件中包含以下内容:

class Dependency { … };
Q_DECLARE_METATYPE(Dependency*)

在所有情况下,您都需要在 Qt Designer 中将 fooWidget 对象提升为 FooWidget 类。

关于c++ - 是否可以在 Qt Designer 中使用依赖注入(inject)(对于 .ui 文件)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54399338/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com