Qt设计器:创建控件数组
也许这是一个愚蠢的问题,但我是新来的C + +和Qt。抱歉给您带来不便。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设计师一样吗?
在此先感谢!
编辑:
最后,我决定做直接分配:
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的基本知识对我来说确实很好。
非常感谢您的回答!这是一个伟大的人民伟大的网站。
最后,我决定做直接分配:
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的基本知识对我来说可以。
非常感谢您的回答和您的支持!这是一个伟大的人民伟大的网站。
我在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的布局,你可以把所有的标签是一个容器对象的儿童和遍历孩子
而不是创建一个明确的数组,你可以说出你的widget使用特定方案,然后在父窗口小部件上使用QObject::findChildren()以获取您之后的窗口小部件列表。
如果你只想隐藏窗口小部件,你可以把所有你想在一个看不见的QFrame隐藏控件(设置frameShape
到NoFrame
),并通过在QFrame
调用setVisible(false)
隐藏它们。这可能会对布局造成一些不必要的副作用,因此您可能需要调整某些尺寸策略设置。
如果你是想隐藏控件,以便您可以模拟一个向导式UI,你可能要检查到QStackedWidget。
我还有一个肮脏的解决方法是:
在头文件
// .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};
阿诺德:谢谢您的回答!但是鉴于我基本的Qt知识,我终于做了直接任务。除此之外,我需要做的不仅仅是隐藏。无论如何,我真的很感谢你的帮助。 – Fracu 2012-02-24 01:40:23
我认为隐藏并不是你唯一的目标:)你可以把自己的答案和接受它。这样可以避免搜索结果中未解决的问题。 – 2012-02-24 01:44:04
我刚刚尝试过,但是因为我不到100的声望,所以我必须再等三个小时才能做到这一点。再次感谢你! – Fracu 2012-02-24 01:57:04