2017-05-31 7 views
0

アプリケーションの設定メニューボックスを作成しようとしており、QDialogボックスを使用してユーザーが変更できるオプションを表示しています。このボックスにはQComboBoxesとQLineEditsが含まれていますが、その多くは7つのコンボボックスと12行の編集です。下部に「Apply Changes」と呼ばれるQPushButtonがあり、ボックス内のプロパティが変更された場合にのみ有効になります。ダイアログボックスのウィジェットのいずれかが信号を発したときにスロットを呼び出すことはできますか?

個々のボタンを個別に有効にするために、各ウィジェットのすべての信号をスロットにリンクする必要がありますか、構成ウィジェットに変更があったときにQDialogボックス自体が出力する信号がありますか?これらの接続の17行以上続く

connect(Combo1,SIGNAL(activated(QString)),this,SLOT(fnEnable(QString))); 
connect(Combo2,SIGNAL(activated(QString)),this,SLOT(fnEnable(QString))) 

は、今のところ私はこれを持っています。私がいることを知っている

(私はdocumentationでものを見つけることができませんでした)(私は前に述べたように)多分、QDialogによって放出される信号を、これを行うための簡単な方法があった場合、私は思っていた

void MyClass::fnEnable(QString) 
{ 
ApplyButton->setEnabled(true); //It is initialised as false 
} 

必要な接続だけが呼び出されるため、プログラムのスピードアップはしませんが、より意欲的なダイアログボックスを簡単にするためのさらなる試みが行われます。

+0

実はそこには、このような信号がありませんが、一つのアプローチはQComboBoxのリストを作成し、作ることですforとの接続は、例えば: 'QList <*QCombobox> l; l << combobox1 << combobox2 << ....; QLineEdit – eyllanesc

答えて

3

は、実際にはそのような信号は存在しないが、一つのアプローチは、例えば、QComboBoxのリストを作成し、用との接続を作ることである。

QList <*QCombobox> l; 
l<<combobox1<< combobox2<< ....; 
for (auto combo: l) { 
    connect(combo, SIGNAL(activated(QString)), this, SLOT(fnEnable(QString)) 
}. 

同じQLineEditで行われるであろう。

+0

と同じことが行われます。これはうまくいきます!これはうまくいく方法です。(自動コンボ:l){connect(combo、SIGNAL(QString))、this、SLOT(fnEnable(QString)私はVC++を使っていたことを忘れていましたが、それは魅力的でした。 –

+0

私はうまくいきません(私はVC++を使っていましたが、foreach(QComboBox * combo、1) 'に変更する必要がありました。 vC++を使用することもできますが、.proファイルに 'CONFIG + = C++ 14'を追加することで" for "を有効にすることができます – eyllanesc

+0

' foreach'はまったく同じことを行います;コンボ。 –

0

あなたはあなたのためのすべての退屈な仕事をするためにウィジェットボックスやレバレッジC++ 11の初期化リストを反復処理することができます

MyClass::MyClass(QWidget * parent) : QWidget(parent) { 
    auto const comboBoxes = {Combo1, Combo2, ... }; 
    for (auto combo : comboBoxes) 
    connect(combo, &QComboBox::activates, this, &MyClass::fnEnable); 
} 

あなたはまた、自動的にすべてのコンボボックスを見つけることができます。

MyClass::MyClass(QWidget * parent) : QWidget(parent) { 
    ui.setupUi(this); // or other setup code 
    for (auto combo : findChildren<QComboBox*>(this)) 
    connect(combo, &QComboBox::activated, this, &MyClass::fnEnable); 
} 

また、ユーザープロパティの変更信号に自動的にアタッチすることもできます。これは、ユーザープロパティを持つすべてのコントロールで機能します。ユーザープロパティは、コントロールが表示しているプラ​​イマリデータを含むコントロールのプロパティです。

コンボボックスを値で配列に保持することもできます。これは、可能なメモリの最小量を取り、うまく実行されるコードで間接参照し、その結果のコストを最小限に抑える:

class MyClass : public QWidget { 
    Q_OBJECT 
    QVBoxLayout m_layout{this}; 
    std::array<QComboBox, 14> m_comboBoxes; 
    ... 
}; 

MyClass(QWidget * parent) : QWidget(parent) { 
    for (auto & combo : m_comboBoxes) { 
    m_layout.addWidget(&combo); 
    connect(&combo, &QComboBox::activates, this, &MyClass::fnEnable); 
    } 
} 
+0

私が尋ねるのを気にしないなら、3番目の方法は最初の方法とどう違うのですか?リストと配列は異なる方法で扱われますか?または、初期化時にコンボボックスの配列を作成するのではなく、既存のコンボボックスをリストに追加しないため、処理が高速になりますか? –

+1

コンボボックスを値で配列に保持するため、3番目の方法が異なります。最初の方法では、コンボボックスへのポインタのコンテナを作成する必要があります。あなたは私にgumballsを求めます。最初の方法では、私はあなたにポストのスタックを与え、ガントガの一部が隠されている家の中の場所をそれぞれ持っています。 2番目の方法では、私はgumballsで満たされたチューブを提供します。どの方法がガンボールでより効率的になるか、どの方法でエラーが発生しにくいかを簡単に確認できます。 –

関連する問題