2012-02-23 69 views
5

có thể đây là câu hỏi ngớ ngẩn nhưng tôi mới sử dụng C++ và đến Qt. Vì vậy, xin lỗi vì sự bất tiện này.Thiết kế Qt: Tạo mảng tiện ích

Trong thiết kế Qt tôi là tạo ra nhiều nhãn (ví dụ):

my_label1 
my_label2 
my_label3 
... 
my_label n 

Sau đó, nếu tôi muốn ẩn chúng tôi làm điều này:

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

Tuy nhiên tôi muốn xác định các nhãn như

my_label[n] 

Vì vậy, tôi có thể thực hiện việc này:

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

tôi đọc mà tôi có thể xác định các widget như:

QLabel* my_label[5]; 

nhưng là có cách nào để làm điều tương tự từ Qt Designer?

Cảm ơn trước!

Edit:

Cuối cùng tôi quyết định làm nhiệm vụ trực tiếp:

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; 

Sau đó, tôi có thể làm ví dụ:

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

Sau đó, tôi đã có thể thực hiện lặp đi lặp lại. Tôi tin rằng đó không phải là cách sạch nhất để làm điều đó nhưng vì kiến ​​thức cơ bản về Qt của tôi là ok cho tôi.

Cảm ơn bạn rất nhiều vì câu trả lời của bạn! Đây là một trang web tuyệt vời với những người tuyệt vời.

Trả lời

2

Cuối cùng tôi quyết định làm nhiệm vụ trực tiếp:

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; 

Sau đó, tôi có thể làm ví dụ:

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

Sau đó, tôi đã có thể thực hiện lặp đi lặp lại. Tôi tin rằng không phải là cách sạch nhất để làm điều đó, nhưng cho kiến ​​thức cơ bản của tôi về Qt là ok cho tôi.

Cảm ơn bạn rất nhiều vì câu trả lời và sự hỗ trợ của bạn! Đây là một trang web tuyệt vời với những người tuyệt vời.

0

Tôi chưa thấy bất kỳ điều gì trong QtDesigner để làm điều đó, nhưng có một vài cách tương đối dễ dàng để có được hành vi đó.

1) Đơn giản chỉ cần lưu trữ các con trỏ my_labelx (từ QtDesigner) trong một mảng (hoặc tốt hơn, một QVector):

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

Sau đó, bạn có thể lặp qua QVector.

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

Có một chút thiết lập cần thiết để thêm tất cả nhãn vào QVector, nhưng về mặt cộng, bạn chỉ làm điều đó một lần.

2) Tùy thuộc vào cách bố trí của gui của bạn, bạn có thể có tất cả các nhãn của bạn được làm con của một đối tượng container và lặp qua các con

3

Thay vì tạo ra một mảng rõ ràng, bạn có thể đặt tên cho widget của bạn sử dụng một lược đồ cụ thể và sau đó sử dụng QObject::findChildren() trên tiện ích con để nhận danh sách các tiện ích con bạn đang sử dụng.

Nếu bạn chỉ muốn ẩn widget, bạn có thể đặt tất cả các công cụ mà bạn muốn ẩn trong một vô hình QFrame (set frameShape để NoFrame) và ẩn tất cả chúng bằng cách gọi setVisible(false) trên QFrame.Điều này có thể gây ra một số tác dụng phụ không mong muốn với bố trí, do đó bạn có thể phải tinh chỉnh một số cài đặt chính sách kích thước.

Trong trường hợp bạn muốn ẩn điều khiển để có thể mô phỏng giao diện người dùng loại trình hướng dẫn, bạn có thể muốn kiểm tra vào QStackedWidget.

+0

Arnold: Cảm ơn bạn đã trả lời của bạn! nhưng với kiến ​​thức Qt cơ bản của tôi, cuối cùng tôi cũng đã trực tiếp chỉ định. Bên cạnh đó tôi cần phải làm nhiều hơn là chỉ ẩn. Dù sao tôi thực sự đánh giá cao sự giúp đỡ của bạn. – Fracu

+0

Tôi nhận thấy rằng việc ẩn giấu không phải là mục tiêu duy nhất của bạn :) Bạn có thể tự mình trả lời và chấp nhận nó. Điều đó sẽ giữ nó ra khỏi kết quả tìm kiếm cho các câu hỏi chưa được trả lời. –

+0

Tôi đã thử, tuy nhiên vì tôi ít hơn 100 danh tiếng, tôi phải đợi thêm ba tiếng nữa để làm điều đó. Cám ơn bạn một lần nữa! – Fracu

1

Tôi có một workaround bẩn cho việc này:

trong tập tin tiêu đề

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

trong tập tin nguồn

// 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}; 
Các vấn đề liên quan