2012-02-23 2231 views
5

也许这是一个愚蠢的问题,但我是新来的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的基本知识对我来说确实很好。

非常感谢您的回答!这是一个伟大的人民伟大的网站。

回答

2

最后,我决定做直接分配:

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的基本知识对我来说可以。

非常感谢您的回答和您的支持!这是一个伟大的人民伟大的网站。

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的布局,你可以把所有的标签是一个容器对象的儿童和遍历孩子

3

而不是创建一个明确的数组,你可以说出你的widget使用特定方案,然后在父窗口小部件上使用QObject::findChildren()以获取您之后的窗口小部件列表。

如果你只想隐藏窗口小部件,你可以把所有你想在一个看不见的QFrame隐藏控件(设置frameShapeNoFrame),并通过在QFrame调用setVisible(false)隐藏它们。这可能会对布局造成一些不必要的副作用,因此您可能需要调整某些尺寸策略设置。

如果你是想隐藏控件,以便您可以模拟一个向导式UI,你可能要检查到QStackedWidget

+0

阿诺德:谢谢您的回答!但是鉴于我基本的Qt知识,我终于做了直接任务。除此之外,我需要做的不仅仅是隐藏。无论如何,我真的很感谢你的帮助。 – Fracu 2012-02-24 01:40:23

+0

我认为隐藏并不是你唯一的目标:)你可以把自己的答案和接受它。这样可以避免搜索结果中未解决的问题。 – 2012-02-24 01:44:04

+0

我刚刚尝试过,但是因为我不到100的声望,所以我必须再等三个小时才能做到这一点。再次感谢你! – Fracu 2012-02-24 01:57:04

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