2016-10-18 9 views
-1

で100 QLabelを超える初期化するために、私は100以上のラベルを更新する機能を持つようにしたいので、私はこのような配列にそれらを置くつもりだった:どのように効率的な方法

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行が悪い考えのようです。 forループまたは何かの内部にQLabel配列を初期化する方法はありますか?

+0

すべての変数が異なる場合はありません。たぶん、QtのUIコンパイラをそれらを配列にする方法があります。あるいは代わりにQListWidgetやQTableWidgetを使うこともできます。 – immibis

+1

GUIエディタプログラムを使用するのではなく、GUIをプログラムで作成することを検討することができます(たとえば、forループ内に「new QLabel」、レイアウトを実行するQBoxLayoutオブジェクトを使用)。それは、エディタで手動で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')を使う方がずっと良いでしょう。 –