gpt4 book ai didi

c++ - 在qt中,我如何实现一个与代码中的变量保持一致的小部件

转载 作者:太空宇宙 更新时间:2023-11-04 12:28:16 24 4
gpt4 key购买 nike

这是一个 SpinBox 示例,它将其更改写入基础变量。我遇到的主要问题是在构建小部件时调用了 valueChanged。有没有更优雅的方法来做到这一点?我认为将小部件连接到自身很奇怪,但 valueChanged 不是虚拟的。

class ValueWriterInt: public QSpinBox {
Q_OBJECT

public:
ValueWriterInt(vector<int*> const& value): myValue(value) {
QObject::connect(this, SIGNAL(valueChanged(int)), this, SLOT(valueChanged(int)));
}
~ValueWriterInt() {}

private slots:
void valueChanged(int new_value) {
for (auto it = myValue.begin(); it != myValue.end(); ++it)
**it = new_value;
}

private:
vector<int*> myValue;
};

最佳答案

我认为将小部件连接到自身并没有什么特别奇怪的。使用单一方法来检测和响应数据更新实际上听起来是件好事,因为您在调试时需要检查的故障点更少。在您的特定情况下,它会导致一些不良行为,但总的来说这是一个很好的解决方案。

现在,在表达了自反连接并非天生不优雅的观点之后,我将提出一个不够“优雅”的解决方案,以防止在构造后调用 valueChanged。您可以有一个标志来确定对象是否刚刚构造并提前返回,以防止代码在构造后立即运行。在你的例子中:

class ValueWriterInt: public QSpinBox {
Q_OBJECT

public:
ValueWriterInt(vector<int*> const& value): myValue(value), myAfterInit(true) {
QObject::connect(this, SIGNAL(valueChanged(int)), this, SLOT(valueChanged(int)));
}
~ValueWriterInt() {}

private slots:
void valueChanged(int new_value) {
if (myAfterInit) {
myAfterInit = false;
return;
}
for (auto it = myValue.begin(); it != myValue.end(); ++it)
**it = new_value;
}

private:
vector<int*> myValue;
boolean myAfterInit;
};

这不是一个太糟糕的解决方案。它至少会为您提供所需的行为,直到(如果)您能找到更优雅的方法。

关于c++ - 在qt中,我如何实现一个与代码中的变量保持一致的小部件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/818981/

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