簡體   English   中英

我們如何在QT代碼中將值傳遞給GUI的所有元素

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM