Qt Designer:创建小部件数组

时间:2012-02-23 22:20:49

标签: arrays qt widget qt-designer

也许这是一个愚蠢的问题,但我是C ++和Qt的新手。很抱歉给您带来不便。

在Qt Designer中我创建了多个标签(例如):

my_label1
my_label2
my_label3
...
my_label n

然后,如果我想隐藏它们,我会这样做:

ui->my_label1->hide();
ui->my_label2->hide();
ui->my_label3->hide();
...
ui->my_labeln->hide();

但是我想定义像

这样的标签
my_label[n]

那么我就能做到这一点:

for(i=0;i<n;i++)
    {
    ui->my_label[n]->hide();
    }

我读到我可以将小部件定义为:

QLabel* my_label[5];

但有没有办法从Qt Designer那里做同样的事情?

提前致谢!

编辑:

最后我决定直接分配:

QLabel* my_label_array[5];
my_label_array[0] = ui->my_label1;
my_label_array[1] = ui->my_label2;
my_label_array[2] = ui->my_label3;
my_label_array[3] = ui->my_label4;
my_label_array[4] = ui->my_label5;

然后我可以这样做:

for(idx=0;idx<6;idx++) my_label_array[idx]->show();
for(idx=0;idx<6;idx++) my_label_array[idx]->hide();
for(idx=0;idx<6;idx++) my_label_array[idx]->setEnabled(1);
for(idx=0;idx<6;idx++) my_label_array[idx]->setDisabled(1);
etc...

然后我能够执行迭代。 我相信这不是最干净的方法,但鉴于我对Qt的基本知识对我来说没问题。

非常感谢您的回答!这是一个很棒的网站。

4 个答案:

答案 0 :(得分:3)

您可以使用特定方案命名窗口小部件,而不是创建显式数组,然后在父窗口小部件上使用QObject::findChildren()来获取您所访问的窗口小部件列表。

如果您只想隐藏小部件,可以将要隐藏的所有小部件放在不可见的QFrame(将frameShape设置为NoFrame)中,并通过调用{隐藏所有小部件setVisible(false)上的{1}}。这可能会导致布局出现一些不必要的副作用,因此您可能需要调整一些大小的策略设置。

如果您想要隐藏控件以便模拟向导类型UI,您可能需要检查QStackedWidget

答案 1 :(得分:3)

最后我决定直接分配:

QLabel* my_label_array[5];
my_label_array[0] = ui->my_label1;
my_label_array[1] = ui->my_label2;
my_label_array[2] = ui->my_label3;
my_label_array[3] = ui->my_label4;
my_label_array[4] = ui->my_label5;

然后我可以这样做:

for(idx=0;idx<6;idx++) my_label_array[idx]->show();
for(idx=0;idx<6;idx++) my_label_array[idx]->hide();
for(idx=0;idx<6;idx++) my_label_array[idx]->setEnabled(1);
for(idx=0;idx<6;idx++) my_label_array[idx]->setDisabled(1);
etc...

然后我能够执行迭代。我相信这不是最干净的方法,但鉴于我对Qt的基本知识对我来说没问题。

非常感谢您的回答和支持!这是一个很棒的网站。

答案 2 :(得分:1)

我还有另一个肮脏的解决方法:

头文件中的

// .hpp
class UiBlabla : public QWidget {
    ...
    QLabel** labels;
};
源文件中的

// constructor
ui->setupUi(this);

labels = new QLabel*[10]{ui->label_0, ui->label_1, ui->label_2, ui->label_3,
                         ui->label_4, ui->label_5, ui->label_6, 
                         ui->label_7, ui->label_8, ui->label_9};

答案 3 :(得分:0)

我没有在QtDesigner中看到过这样做的事情,但是有一些相对简单的方法可以解决这个问题。

1)只需将my_labelx指针(来自QtDesigner)存储在一个数组中(或更好,一个QVector):

QVector<QLabel*> my_labels;
my_labels.push_back(ui->my_label1);
my_labels.push_back(ui->my_label2);

然后你可以遍历QVector。

for(int i=0; i < my_labels.size(); ++i) {
   my_labels[i]-> hide();
}
// or with QFOREACH
foreach(QLabel* label, my_labels)
  label->hide();

在将所有标签添加到QVector方面需要一些设置,但从正面来看,您只需要执行一次。

2)根据gui的布局,你可以让你的所有标签都是容器对象的子代,并遍历孩子们