2012-02-23 115 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};