[英]How do we pass the value to all the elements of GUI in this QT code
我正在閱讀有關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();
如書和匯編所示,更改其中一個小部件的值會導致更改其他元素的值。
我不明白是怎么回事。 我們如何將該值從一個小部件傳遞給其余小部件? 沒有變量可以通過一個小部件更改並傳遞給其他小部件。
PS從概念上講,我確實了解插槽和信號以及“連接”的概念。 這就是將值從一個小部件傳遞到其余小部件的方式。
信號是一種C ++方法,其代碼由稱為moc
(元對象編譯器)的實用程序生成。 插槽是常規的C ++方法,代碼在您的控制之下。 連接是一種讓信號知道要呼叫哪些時隙的方法。 發出信號時,實際上意味着您調用了機器生成的方法,該方法會迭代連接列表。
從概念上講, valueChanged
信號實現如下所示:
void valueChanged(int value) {
for (slot : this->slots)
(slot.object->*slot.method)(value);
}
因此,當滑塊“發出”其信號時,它將使用給定值調用每個插槽。 建立連接之后,您應該考慮Spinbox的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();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.