gpt4 book ai didi

c++ - Qt - 如何自动生成变量名?

转载 作者:行者123 更新时间:2023-11-27 23:56:37 31 4
gpt4 key购买 nike

在我的程序中,我想向 gridLayout 添加 2 个新的 QLineEdit,但仅在必要时才这样做。因此,如果满足要求,我将添加一个名为 lineEdit1 的 QLineEdit 和另一个名为 lineEdit2 的 QLineEdit。但是在寻找解决方案时,我看到人们说那不可能或使用数组。

所以我的问题是它是如何在 Qt 设计器中完成的。因为当您在 Qt 设计器中添加 2 个相同的新项目时,例如标签,它们将被命名为:labellabel_2。如果您生成 ui_**.h,它们将被创建 QLabel* labelQLabel* label_2

他们是怎么做到的?

最佳答案

Qt 设计器使用称为用户界面 (UI) 文件的类似 XML 的文件来表示表单的布局。此文件以分层方式描述结构。

在构建过程中,.ui 文件由名为 User Interface Compiler 的工具使用。 (uic 或 uic.exe)为您生成源代码。源代码放在头文件中,该头文件包含在与 UI 文件相关的类中。

当然,这也可以手动完成。这种方法与您想要实现的目标之间的区别在于决策时间。上述过程使用了在编译时 已知的信息。所以程序员在编写源代码时就知道有这样的变量,他可以通过使用它们的名称来访问它们。

您似乎想在运行时 做出决定。这也许就是人们建议使用数组的原因。问题是编译器不知道你想要多少个对象。所以你需要某种动态数据结构来存储指向你在运行时创建的对象的指针,只是因为你没有变量来存储指针。

请注意,您不一定需要持久指向对象的指针,因为 Qt(适当使用)会为您进行内存管理,因此一种可能的解决方案是使用局部变量进行临时使用并将对象添加到网格。假设有一个名为 gridLayout 的空 QGridLayout,您可以执行如下操作:

bool cond1;
bool cond2;
int row = 0;
int column = 0;

/* set cond1 and cond2 based on your decision logic */

if(cond1)
{
QLineEdit *lineEdit = new QLineEdit("Text for LineEdit 1", this);
gridLayout->addWidget(lineEdit, row, column);
row++;
column++;
}

if(cond2)
{
QLineEdit *lineEdit = new QLineEdit("Text for LineEdit 2", this);
gridLayout->addWidget(lineEdit, row, column);
row++;
column++;
}

另一种常见的解决方案是静态添加所有可能的小部件(虽然这并不总是可能的)并且只动态切换它们的可见性,如下所示:

bool cond1;
bool cond2;
lineEdit1->setVisible(cond1); /* Alternatevily show(), hide() */
lineEdit2->setVisible(cond2);

通过这种方法,您甚至可以使用 Qt 设计器,并且可以在您想要切换的小部件数量很少的情况下使用。缺点是它不能很好地扩展。

关于c++ - Qt - 如何自动生成变量名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42245830/

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