gpt4 book ai didi

c++ - 我们如何在这段QT代码中将值传递给GUI的所有元素

转载 作者:行者123 更新时间:2023-11-28 05:36:55 25 4
gpt4 key购买 nike

我正在阅读一本关于 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);
}

因此,当 slider “发出”其信号时,它会调用具有给定值的每个插槽。建立连接后,您应该将旋转框的 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();
}

关于c++ - 我们如何在这段QT代码中将值传递给GUI的所有元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38061048/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com