1

这是一个 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;
};
4

3 回答 3

1

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

现在,在表达了自反连接并非天生不优雅的观点之后,我将建议一种不太“优雅”的解决方案来防止调用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;
};

这不是一个太糟糕的解决方案。它至少会给你你想要的行为,直到(如果)你能找到一个更优雅的方法。

于 2009-05-04T15:30:23.173 回答
0

那么你想在这里完成什么?是的,valueChanged 不是虚拟的——为什么它应该是,你的对象应该直接将它们自己的槽连接到它们想要响应的任何信号,不是吗?

于 2009-05-04T06:53:45.583 回答
0

除了使用 SIGNAL-SLOT 连接,我没有其他选择。但是,我会更改插槽的名称,因此它与信号的名称不同。

即使尚未完成连接,如何调用插槽也很有趣。我怀疑更改插槽的名称将解决该问题。

于 2009-05-04T08:48:05.170 回答