C++ Qt-如何自动生成变量名?
在我的程序中,我想在gridLayout中添加2个新的QLineEdit,但仅在必要时。 所以,如果满足要求,我将添加一个名为C++ Qt-如何自动生成变量名?,c++,qt,C++,Qt,在我的程序中,我想在gridLayout中添加2个新的QLineEdit,但仅在必要时。 所以,如果满足要求,我将添加一个名为lineEdit1的QLineEdit和另一个名为lineEdit2的QLineEdit。 但在寻找解决方案时,我看到人们说这是不可能的,或者使用数组 所以我的问题是如何在Qt设计器中实现它。因为当您在Qt designer中添加两个相同的新项(例如标签)时,它们将被命名为:label和label_2。如果生成ui_**.h,将创建QLabel*label和QLabel*
lineEdit1
的QLineEdit和另一个名为lineEdit2
的QLineEdit。
但在寻找解决方案时,我看到人们说这是不可能的,或者使用数组
所以我的问题是如何在Qt设计器中实现它。因为当您在Qt designer中添加两个相同的新项(例如标签)时,它们将被命名为:label
和label_2
。如果生成ui_**.h,将创建QLabel*label
和QLabel*label\u 2
它们是如何做到的?是否希望在运行时从代码中动态添加这两个元素?或者您想通过QDesigner将它们添加到UI表单中,默认情况下隐藏,然后根据其他规则显示 下面是一个关于如何隐藏\显示UI表单中预定义的特定元素的示例: //widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
namespace Ui {
class Widget;
}
class QPushButton;
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private slots:
void switchVisibility();
private:
bool mFlag;
QList<QPushButton*> mButtons;
Ui::Widget *ui;
};
#endif // WIDGET_H
//main.cpp
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
bool requirement = true;
// hide elements based on flag
if(!requirement)
{
ui->lineEdit1->hide();
ui->lineEdit2->hide();
}
else
{
ui->lineEdit1->show();
ui->lineEdit2->show();
}
}
Widget::~Widget()
{
delete ui;
}
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
#include "widget.h"
#include "ui_widget.h"
#include <QPushButton>
Widget::Widget(QWidget *parent) :
QWidget(parent),
mFlag(true),
ui(new Ui::Widget)
{
ui->setupUi(this);
int count = 0;
for(int row=0; row < 4; row++) {
for(int column = 0; column < 4; column++ ) {
// count button, for label
count++;
// create button
QPushButton* button = new QPushButton(this);
button->setText(QString::number(count));
// add this button to grid layout in our gui
ui->mLayoutButtons->addWidget(button, row, column);
// put a pointer to button object into our array (QList)
// if we need to do something with it later
mButtons.append(button);
}
}
// connect hide button click to slot
QObject::connect(ui->mButtonHide, &QPushButton::clicked, this, &Widget::switchVisibility);
}
Widget::~Widget()
{
}
void Widget::switchVisibility()
{
// flip bool value
mFlag = !mFlag;
foreach (QPushButton* button, mButtons) {
button->setVisible(mFlag);
}
}
#包括“widget.h”
#包括
int main(int argc,char*argv[])
{
质量保证申请a(argc、argv);
小部件w;
w、 show();
返回a.exec();
}
//widget.ui
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Widget</class>
<widget class="QWidget" name="Widget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<property name="windowTitle">
<string>Widget</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QLineEdit" name="lineEdit1"/>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="lineEdit2"/>
</item>
</layout>
</widget>
<layoutdefault spacing="6" margin="11"/>
<resources/>
<connections/>
</ui>
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Widget</class>
<widget class="QWidget" name="Widget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QGridLayout" name="mLayoutButtons"/>
</item>
<item>
<widget class="QPushButton" name="mButtonHide">
<property name="text">
<string>Click me</string>
</property>
</widget>
</item>
</layout>
</widget>
<layoutdefault spacing="6" margin="11"/>
<resources/>
<connections/>
</ui>
小装置
0
0
400
300
小装置
是否要在运行时从代码中动态添加这两个元素?或者您想通过QDesigner将它们添加到UI表单中,默认情况下隐藏,然后根据其他规则显示
下面是一个关于如何隐藏\显示UI表单中预定义的特定元素的示例:
//widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
namespace Ui {
class Widget;
}
class QPushButton;
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private slots:
void switchVisibility();
private:
bool mFlag;
QList<QPushButton*> mButtons;
Ui::Widget *ui;
};
#endif // WIDGET_H
//main.cpp
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
bool requirement = true;
// hide elements based on flag
if(!requirement)
{
ui->lineEdit1->hide();
ui->lineEdit2->hide();
}
else
{
ui->lineEdit1->show();
ui->lineEdit2->show();
}
}
Widget::~Widget()
{
delete ui;
}
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
#include "widget.h"
#include "ui_widget.h"
#include <QPushButton>
Widget::Widget(QWidget *parent) :
QWidget(parent),
mFlag(true),
ui(new Ui::Widget)
{
ui->setupUi(this);
int count = 0;
for(int row=0; row < 4; row++) {
for(int column = 0; column < 4; column++ ) {
// count button, for label
count++;
// create button
QPushButton* button = new QPushButton(this);
button->setText(QString::number(count));
// add this button to grid layout in our gui
ui->mLayoutButtons->addWidget(button, row, column);
// put a pointer to button object into our array (QList)
// if we need to do something with it later
mButtons.append(button);
}
}
// connect hide button click to slot
QObject::connect(ui->mButtonHide, &QPushButton::clicked, this, &Widget::switchVisibility);
}
Widget::~Widget()
{
}
void Widget::switchVisibility()
{
// flip bool value
mFlag = !mFlag;
foreach (QPushButton* button, mButtons) {
button->setVisible(mFlag);
}
}
#包括“widget.h”
#包括
int main(int argc,char*argv[])
{
质量保证申请a(argc、argv);
小部件w;
w、 show();
返回a.exec();
}
//widget.ui
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Widget</class>
<widget class="QWidget" name="Widget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<property name="windowTitle">
<string>Widget</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QLineEdit" name="lineEdit1"/>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="lineEdit2"/>
</item>
</layout>
</widget>
<layoutdefault spacing="6" margin="11"/>
<resources/>
<connections/>
</ui>
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Widget</class>
<widget class="QWidget" name="Widget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QGridLayout" name="mLayoutButtons"/>
</item>
<item>
<widget class="QPushButton" name="mButtonHide">
<property name="text">
<string>Click me</string>
</property>
</widget>
</item>
</layout>
</widget>
<layoutdefault spacing="6" margin="11"/>
<resources/>
<connections/>
</ui>
小装置
0
0
400
300
小装置
Qt设计器使用称为用户界面(UI)文件的类似XML的文件来表示表单的布局。这些文件以hirchical的方式描述结构
在生成过程中,.ui文件由一个名为(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设计器,并且可以在您想要切换的小部件数量较少时使用。缺点是它不能很好地扩展。Qt设计器使用称为用户界面(UI)文件的类似XML的文件来表示表单的布局。这些文件以hirchical的方式描述结构 在生成过程中,.ui文件由一个名为(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设计器,并且可以在您想要切换的小部件数量较少时使用。缺点是它不能很好地扩展。如果您想在运行时动态添加这些对象,那么您需要使用一个对象数组,以便能够在初始化之后及时处理对象 下面是一个简单的例子。我刚刚在中添加了一个QGridLayout