Qt - 声明一个QLabel数组并将其添加到QTabWidget的选项卡中

时间:2014-07-15 17:38:58

标签: qt qlabel qtabwidget

我已经声明了一个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 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);
}

是否可以直接将标签添加到标签的主体而无需声明布局(因为我需要对我在程序中声明的每个创建的数组执行此操作,而且我没有想法如何定位)?

如何正确定位标签?

2 个答案:

答案 0 :(得分:0)

  

是否可以直接将标签添加到标签的正文而无需声明布局(...)?

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

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]);
    }
}
  

如何正确定位标签?

Here是一篇文章,描述了如何为Qt 4.8使用不同的布局,或者为Qt5.3使用here

答案 1 :(得分:0)

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

使用C ++ 11,您应该使用range-based for枚举安全,零开销std::array

否则,使用C风格的数组和sizeof(array)/sizeof(array[0])惯用语从设置方法中确定其大小。

编写了大量基于QWidget的代码后,我现在通常认为在窗口小部件的构造函数中显式分配在堆上的子窗口小部件是过早的悲观。几乎没有理由以这种方式编写代码。小部件已经在堆上分配了它们的实现数据(the pimpl idiom)。当你在堆上分配这个瘦的,指针大小的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();
}