2016-06-27 5 views
0

は本からの例です。このQTコード内のGUIのすべての要素に値を渡してください:ブックとしてはどのように我々は、私がここにQT4についての本を読んでい

QApplication a(argc, argv); 
QWidget window; 

QVBoxLayout* mainLayout = new QVBoxLayout(&window); 

QLabel* label = new QLabel("0"); 
QSpinBox* spinBox = new QSpinBox; 
QSlider* slider = new QSlider(Qt::Horizontal); 

mainLayout->addWidget(label); 
mainLayout->addWidget(spinBox); 
mainLayout->addWidget(slider); 

QObject::connect(spinBox, SIGNAL(valueChanged(int)), label, SLOT(setNum(int))); 
QObject::connect(spinBox, SIGNAL(valueChanged(int)), slider, SLOT(setValue(int))); 
QObject::connect(slider, SIGNAL(valueChanged(int)), label, SLOT(setNum(int))); 
QObject::connect(slider, SIGNAL(valueChanged(int)), spinBox, SLOT(setValue(int))); 

window.show(); 

とウィジェットの1つの値を変更すると、他の要素の値が変更されます。

何を私は理解していませんはどうなるのですか?あるウィジェットからその値をどのように他のウィジェットに渡すのですか? 1つのウィジェットによって変更され、他のウィジェットに渡される変数はありません。

PS概念的には、私はスロットと信号と '接続'の考え方を理解しています。あるウィジェットから別のウィジェットに値が渡される方法が問題です。

答えて

1

シグナルは、moc(メタオブジェクトコンパイラ)というユーティリティによって生成されたコードを持つC++メソッドです。スロットは通常のC++メソッドで、コードはあなたのコントロール下にあります。接続とは、呼び出すスロットを信号で知らせる方法です。シグナルが放射されると、実際には、接続リストを反復するマシン生成のメソッドを呼び出すことを意味します。

は、概念的には、valueChanged信号の実装は次のようになります。スライダーがその信号を「放出する」場合

void valueChanged(int value) { 
    for (slot : this->slots) 
    (slot.object->*slot.method)(value); 
} 

したがって、それは指定された値で各スロットを呼び出します。接続が行われた後、あなたがやってスピンボックスのvalueChanged信号を考える必要があり、以下:

シグナルスロットメカニズムであるため、その中核に、変更されますない「変数」は、ありません
void SpinBox::valueChanged(int value) { 
    // 1st connection 
    label->setNum(value); 
    // 2nd connection 
    slider->setVale(value); 
} 

簡単に-へ - 間接的なメソッド呼び出しを行う方法を(メソッドポインタとインスタンスポインタを介して)使用します。現代のコード(Qt5/C++ 11)において

、その例は(これは完全なコードである)であろう:

#include <QtWidgets> 

int main(int argc, char** argv) { 
    QApplication a{argc, argv}; 
    QWidget window; 

    QVBoxLayout mainLayout{&window}; 

    QLabel label{"0"}; 
    QSpinBox spinBox; 
    QSlider slider{Qt::Horizontal}; 

    mainLayout.addWidget(&label); 
    mainLayout.addWidget(&spinBox); 
    mainLayout.addWidget(&slider); 

    QObject::connect(&spinBox, static_cast<void(QSpinBox::*)(int)>(&QSpinBox::valueChanged), 
        &label, static_cast<void(QLabel::*)(int)>(&QLabel::setNum)); 
    QObject::connect(&spinBox, static_cast<void(QSpinBox::*)(int)>(&QSpinBox::valueChanged), 
        &slider, static_cast<void(QSlider::*)(int)>(&QSlider::setValue)); 
    QObject::connect(&slider, static_cast<void(QSlider::*)(int)>(&QSlider::valueChanged), 
        &label, static_cast<void(QLabel::*)(int)>(&QLabel::setNum)); 
    QObject::connect(&slider, &QSlider::valueChanged, &spinBox, &QSpinBox::setValue); 

    window.show(); 
    return a.exec(); 
} 
関連する問題