2016-10-18 27 views
-1

我想有超過100個標籤,以更新的能力,所以我打算把它們放入數組是這樣的:如何初始化超過100 QLabel以高效的方式

voltage_label_array[0] = this->ui->Voltage_0; 
voltage_label_array[1] = this->ui->Voltage_1; 
voltage_label_array[...] = this->ui->Voltage_2; 
voltage_label_array[...n] = this->ui->Voltage_n; 

,然後有這個方法

void MainWindow::updateValue(int i, int voltage){ 
    voltage_label_array[i]->setText(QString::number(voltage)); 
} 

但有100行來設置這似乎是一個壞主意。有沒有辦法可以初始化一個QLabel數組內的for循環或什麼?

+0

如果它們都是單獨的變量,則不適用。也許有一種方法可以讓Qt的UI編譯器將它們放入數組中,或者也可以使用QListWidget或QTableWidget代替。 – immibis

+1

您可能會考慮以編程方式構建GUI(例如,在for循環中使用「new QLabel」,使用QBoxLayout對象執行佈局)而不是使用GUI編輯器程序。這比在編輯器中手動構建100多個小部件要快,並且在將來更容易維護/更新。 –

回答

2

如果您需要這樣做,您的設計會出現嚴重錯誤。但這是可能的。

假設你的標籤被命名爲Voltage_0Voltage_99

for(int i = 0; i < 100; ++i) { 
    auto ptr = this->findChild<QLabel*>(QString("Voltage_%1").arg(i)); 
    voltage_label_array[i] = ptr; 
} 

該「辦法」使用Qt的運行時反射並進行預期的性能損失。

但是,如果您需要顯示幾個類似的值,請查找QListWidget和類似的類。

+3

查找應該在小部件的構造函數中調用'setupUi(this)'後立即完成,找到正確的父小部件的子元素,然後就不會有任何性能損失可言。儘管在一個循環中創建子部件會比在'.ui'文件中創建子部件簡單得多。當然,使用視圖控件('QListWidget'或'QListView')會更好。 –