Qt-声明QLabel数组并将其添加到QTabWidget';s标签

Qt-声明QLabel数组并将其添加到QTabWidget';s标签,qt,qlabel,qtabwidget,Qt,Qlabel,Qtabwidget,我已经声明了一个QLabel数组(我将使用它作为图片框)和将填充项目头文件中数组的函数调用,如下所示: void fillArray(); QLabel *label_array[7]; 然后我调用main()中声明的函数。该函数将填充数组并将标签添加到QTabWidget选项卡的主体。在源文件中,我编写了以下内容: void MainWindow::fillArray() { for (int i = 0; i < sizeof(MainWindow::label_array)

我已经声明了一个QLabel数组(我将使用它作为图片框)和将填充项目头文件中数组的函数调用,如下所示:

void fillArray();
QLabel *label_array[7];
然后我调用main()中声明的函数。该函数将填充数组并将标签添加到QTabWidget选项卡的主体。在源文件中,我编写了以下内容:

void MainWindow::fillArray()
{
    for (int i = 0; i < sizeof(MainWindow::label_array) - 1; i++)
    {
        MainWindow::label_array[i] = new QLabel("Label " + i + 1);
        ui->tabWgt->widget(0)->layout()->addWidget(MainWindow::label_array[i])
    }
}
void主窗口::fillArray()
{
对于(int i=0;itabWgt->widget(0)->layout()->addWidget(主窗口::标签\数组[i])
}
}
但问题是,在我构建程序时,它会返回一个错误。我试着创建一个布局,并将其添加到布局中,然后将选项卡的布局设置为该布局,这样做是可行的,但它变得非常混乱,而且不可理解

void MainWindow::fillArray()
{
    QHBoxLayout *layout = new QHBoxLayout;
    for (int i = 0; i < sizeof(MainWindow::label_array) - 1; i++)
    {
        MainWindow::label_array[i] = new QLabel("Label " + i + 1);
        MainWindow::label_array[i]->move(10, 5*i); // this doesn't work...
        layout->addWidget(MainWindow::label_array[i]);
    }
    ui->tabWgt->widget(0)->setLayout(layout);
}
void主窗口::fillArray()
{
QHBoxLayout*布局=新的QHBoxLayout;
对于(int i=0;imove(10,5*i);//这不起作用。。。
布局->添加小部件(主窗口::标签数组[i]);
}
ui->tabWgt->widget(0)->setLayout(布局);
}
是否可以在不声明布局的情况下将标签直接添加到选项卡的主体中(因为我需要对我在程序中声明的每个创建的数组进行添加,而我不知道它们是如何定位的)

如何正确定位标签

是否可以直接将标签添加到选项卡主体,而不必声明布局(…)

不,因为默认情况下小部件没有布局,您必须创建它。但你可以做得更清楚:

void MainWindow::fillArray()
{
    /* set layout for tab */
    ui->tabWgt->widget(0)->setLayout(new QVBoxLayout); 

    /* calculate size of array */
    const uint array_size = sizeof(MainWindow::label_array)/sizeof(MainWindow::label_array[0]);

    /* fill tab widget */
    for (uint i = 0; i < array_size; i++)
    {
        MainWindow::label_array[i] = new QLabel(QString("Label %1").arg(i+1));
        ui->tabWgt->widget(0)->layout()->addWidget(MainWindow::label_array[i]);
    }
}
void主窗口::fillArray()
{
/*设置选项卡的布局*/
ui->tabWgt->widget(0)->setLayout(新的QVBoxLayout);
/*计算数组的大小*/
常量数组_size=sizeof(MainWindow::label_数组)/sizeof(MainWindow::label_数组[0]);
/*填充选项卡小部件*/
对于(uint i=0;itabWgt->widget(0)->layout()->addWidget(主窗口::标签数组[i]);
}
}
如何正确定位标签


这篇文章描述了如何为Qt 4.8或Qt5.3使用不同的布局。

在任何情况下,您都不需要在堆上显式分配标签。您应该将它们直接存储为成员数组

对于C++11,您应该使用枚举安全的零开销

否则,请使用C样式数组和
sizeof(array)/sizeof(array[0])
习惯用法从setup方法中确定其大小

编写了一组完整的<代码> QWIDGET 代码,现在我通常认为在小部件的构造函数堆中显式分配的子控件是过早的悲观。很少有理由这样编写代码。这些小部件已经在堆()上分配了它们的实现数据。当您在堆上分配这个瘦的、指针大小的

QWidget
子类时,您只是在毫无理由地将堆分配的数量增加一倍。不要

#include <QApplication>
#include <QLabel>
#include <QVBoxLayout>
#include <array>

class WidgetCpp11 : public QWidget {
    QVBoxLayout m_layout;
    std::array<QLabel, 3> m_labels; // No overhead compared to `QLabel m_labels[3]`
    void setupLabels() {
        int n = 1;
        for (QLabel & label: m_labels) {
            label.setText(QString("Label %1").arg(n++));
            m_layout.addWidget(&label);
        }
    }
public:
    WidgetCpp11(QWidget * parent = 0) : QWidget(parent), m_layout(this) {
        setupLabels();
    }
};

class WidgetCpp98 : public QWidget {
    QVBoxLayout m_layout;
    QLabel m_labels[3];
    void setupLabels() {
        for (uint i = 0; i < sizeof(m_labels)/sizeof(m_labels[0]); ++i) {
            m_labels[i].setText(QString("Label %1").arg(i+1));
            m_layout.addWidget(m_labels+i);
        }
    }
public:
    WidgetCpp98(QWidget * parent = 0) : QWidget(parent), m_layout(this) {
        setupLabels();
    }
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    WidgetCpp98 w;
    w.show();
    return a.exec();
}
#包括
#包括
#包括
#包括
WidgetCpp11类:公共QWidget{
QVBoxLayout MU布局;
std::array m_labels;//与'QLabel m_labels[3]相比没有开销`
void setupLabels(){
int n=1;
用于(QLabel和标签:m_标签){
label.setText(QString(“标签%1”).arg(n++);
m_layout.addWidget(&label);
}
}
公众:
WidgetCpp11(QWidget*parent=0):QWidget(parent),m_布局(this){
设置标签();
}
};
WidgetCpp98类:公共QWidget{
QVBoxLayout MU布局;
QLabel m_标签[3];
void setupLabels(){
对于(uint i=0;i