gpt4 book ai didi

c++ - Qt:自定义小部件的多种布局

转载 作者:行者123 更新时间:2023-11-30 05:04:09 25 4
gpt4 key购买 nike

我正在开发一个由其他小部件(按钮、标签、查看器等)组成的自定义小部件,它将成为其他项目中的一个模块。此自定义小部件具有多个布局很重要。

布局将根据一些动态确定的因素而改变,比如作为一部分的应用程序(例如,对于 X 应用程序,我们希望内容垂直排列,或者我们希望 Z 小部件紧挨着 M 小部件,而不是一个在另一个小部件下面) 并且还取决于检测到的功能(如果未检测到硬件 X,则隐藏 A、B、C 小部件)。

直到现在,我在 Designer Form 中只有一个布局,我会在运行中以编程方式稍微修改它以进行小的重新排列。这不再可行,因为在某些应用程序中我们需要一个完全不同的布局。

因此,总而言之,我们有固定数量的小部件,但我们希望根据一些动态确定的因素进行不同的重新排列和可见性。

处理这种情况的正确方法是什么?

到目前为止我想到的解决方案:

  • 创建多个 .ui 文件并使用 QUiLoader 动态加载我需要的文件

  • 完全以编程方式创建布局

  • 创建带有堆叠小部件的单个 .ui 文件,每个页面都会有不同的布局。切换布局时,“事件”布局的小部件将通过指针分配。

最佳答案

我建议选项 #2,以及一种干净的实现方式。

如果您的自定义小部件只是一个带有一些子小部件的 QWidget 子类,您可以添加一个 protected 虚拟方法,它只负责布置子部件,以及一个静态工厂方法来实例化正确的子类,具体取决于运行时配置选项.

只需将子实例设为 protected 成员,以便子类可以访问它们,添加 protected customlayout 纯虚方法、公共(public)initialize 方法和静态创建 方法。在构造函数中,只需设置子部件并连接信号和槽(不要介意子部件的位置和可见性,在这里)。调用后,initialize 方法会将虚函数返回的布局设置为自定义小部件布局。

class CustomWidget : public QWidget
{
Q_OBJECT

protected:

virtual QLayout * customlayout() = 0;

QLabel a;
QLineEdit b;
QPushButton c;

public:
CustomWidget(QWidget * p) : QWidget(p)
{
a.setText("Text:");
c.setText("Ok");

//setup signals/slot etc.

}
void initialize()
{
setLayout(customlayout());
}

static CustomWidget * create();
};

一些可能的实现:

#include <QHBoxLayout>

class XCustomWidget : public CustomWidget
{
public:
XCustomWidget() : CustomWidget(nullptr){}
protected:
QLayout * customlayout() override
{
QHBoxLayout * l = new QHBoxLayout();
l->addWidget(&a);
l->addWidget(&b);
l->addWidget(&c);
return l;
}
};

#include <QVBoxLayout>

class YCustomWidget : public CustomWidget
{
public:
YCustomWidget() : CustomWidget(nullptr){}
protected:
QLayout * customlayout() override
{
QVBoxLayout * l = new QVBoxLayout();
l->addWidget(&a);
l->addWidget(&b);
c.setVisible(false);
l->addStretch(1);
return l;
}
};

可能的工厂实现:

CustomWidget *CustomWidget::create()
{
//read configuration ...

if(isApplicationX)
{
return new XCustomWidget();
}

if(isApplicationY)
{
return new YCustomWidget();
}
}

和实例化(例如在表单构造函数中):

CustomWidget * w = CustomWidget::create();
w->initialize();
layout()->addWidget(w);

关于c++ - Qt:自定义小部件的多种布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49069265/

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