2012-02-23 15 views
5

może to głupie pytanie, ale jestem nowy w C++ i Qt. Bardzo przepraszam za tę niedogodność.Projektant Qt: tworzenie tablicy widżetów

w Qt Designer tworzę wiele etykiet (na przykład):

my_label1 
my_label2 
my_label3 
... 
my_label n 

Następnie, jeśli chcę, aby je ukryć Mam to:

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

Jednak chciałbym zdefiniować etykiety takie jak

my_label[n] 

tak to byłbym w stanie to zrobić:

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

czytałem, że można zdefiniować widget jak:

QLabel* my_label[5]; 

ale czy jest jakiś sposób, żeby zrobić to samo z Qt Designer?

Z góry dzięki!

Edit:

Wreszcie postanowiłem zrobić bezpośredniego przypisania:

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; 

Następnie można zrobić na przykład:

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... 

potem byłem w stanie wykonywać iteracje. Wierzę, że nie jest to najczystszy sposób na zrobienie tego, ale biorąc pod uwagę moją podstawową wiedzę na temat Qt jest dla mnie w porządku.

Dziękuję bardzo za odpowiedzi! To wspaniała strona z świetnymi ludźmi.

Odpowiedz

2

Wreszcie postanowiłem zrobić bezpośredniego przypisania:

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; 

Następnie można zrobić na przykład:

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... 

potem byłem w stanie wykonywać iteracje. Uważam, że nie jest to najczystszy sposób na zrobienie tego, ale biorąc pod uwagę moją podstawową wiedzę na temat Qt jest dla mnie ok.

Dziękuję bardzo za odpowiedzi i wsparcie! To wspaniała strona z świetnymi ludźmi.

0

Nie widziałem nic w QtDesigner, aby to zrobić, ale istnieje kilka stosunkowo prostych sposobów na uzyskanie tego zachowania.

1) Wystarczy przechowywać wskaźniki my_labelx (z QtDesigner) w tablicy (lub lepiej, A QVector):

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

Następnie można iterację QVector.

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

Jest trochę setup potrzebne w kategoriach dodaniu wszystkich etykiet do QVector, ale na plus tylko zrobić to raz.

2) W zależności od układu swojej gui, można mieć wszystkie etykiety być dziećmi obiektu kontenera i iterację dzieci

3

Zamiast tworzyć wyraźny tablicę, może być w stanie nazwać swoje widżety za pomocą określonego schematu, a następnie użyj QObject::findChildren() w widgecie nadrzędnym, aby uzyskać listę widżetów, których szukasz.

Jeśli tylko chcesz ukryć widżety można umieścić wszystkie widżety, które chcesz ukryć w niewidzialny QFrame (set frameShape do NoFrame) i ukryć je wszystkie poprzez wywołanie setVisible(false) na QFrame.Może to powodować niepożądane efekty uboczne w układach, więc konieczne może być dostosowanie niektórych ustawień polityki rozmiaru.

Jeśli chcesz ukryć formanty, aby można było symulować interfejs typu kreatora, możesz sprawdzić w QStackedWidget.

+0

Arnold: Dziękuję za odpowiedź! ale biorąc pod uwagę moją podstawową wiedzę Qt, w końcu wykonałem bezpośrednie zadanie. Poza tym musiałem zrobić coś więcej, niż tylko ukryć. W każdym razie naprawdę doceniam twoją pomoc. – Fracu

+0

Uznałem, że ukrywanie nie jest twoim jedynym celem :) Możesz umieścić własną odpowiedź i zaakceptować ją. Dzięki temu nie będą wyświetlane odpowiedzi na pytania, na które nie ma odpowiedzi. –

+0

Po prostu próbowałem, ale skoro mam mniej niż 100 punktów reputacji, muszę poczekać jeszcze trzy godziny. Jeszcze raz dziękuję! – Fracu

1

mam inny brudną obejście tego:

w pliku nagłówkowym

// .hpp 
class UiBlabla : public QWidget { 
    ... 
    QLabel** labels; 
}; 

w pliku źródłowym

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