Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Qt-如何自动生成变量名?_C++_Qt - Fatal编程技术网

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

C++ Qt-如何自动生成变量名?,c++,qt,C++,Qt,在我的程序中,我想在gridLayout中添加2个新的QLineEdit,但仅在必要时。 所以,如果满足要求,我将添加一个名为lineEdit1的QLineEdit和另一个名为lineEdit2的QLineEdit。 但在寻找解决方案时,我看到人们说这是不可能的,或者使用数组 所以我的问题是如何在Qt设计器中实现它。因为当您在Qt designer中添加两个相同的新项(例如标签)时,它们将被命名为:label和label_2。如果生成ui_**.h,将创建QLabel*label和QLabel*

在我的程序中,我想在gridLayout中添加2个新的QLineEdit,但仅在必要时。 所以,如果满足要求,我将添加一个名为
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