gpt4 book ai didi

c++ - 使用 Qt 信号和槽与直接调用方法

转载 作者:可可西里 更新时间:2023-11-01 15:07:50 46 4
gpt4 key购买 nike

假设我有一个带有 slider 的主窗口和该窗口内的一个小部件,该窗口带有一个名为 setValue(int) 的方法。每当 slider 的值发生变化时,我都想调用此方法。

以下两种实现方式之间是否存在实际差异:

1

void MainWindow::on_slider_valueChanged(int value)
{
ui->widget->setValue(value);
}

2

// somewhere in constructor
connect(ui->slider, SIGNAL(valueChanged(int)), ui->widget, SLOT(setValue(int)));

对我来说,第一种方法看起来更好,因为它可能避免了一些与信号和槽机制相关的开销,而且允许我在将 value 发送到 widget 之前对其进行处理>,如果有需要的话。

有没有第二种方案更好的场景?

最佳答案

这两种方法都使用信号槽连接。在第一种情况下,connect 调用由 QMetaObject::connectSlotsByName()setupUi 调用。在第二种情况下,您自己显式调用 connect

另外,当使用 C++11 时,第一种方法在 Qt5 中是不必要的。您可以修改 lambda 中的值:

QObject::connect(ui->slider, &QAbstractSlider::valueChanged,
[this](int val){ ui->widget->setValue(val*2); });

为了防止ui->widget被删除,你应该使用QPointer:

class MyWindow : public QMainWindow {
QPointer<QAbstractSlider> m_widget;
...
public:
MyWindow(QWidget * parent = 0) : QMainWindow(parent) {
...
setupUi(this);
m_widget = ui->widget;
QObject::connect(ui->slider, &QAbstractSlider::valueChanged,
[this](int val)
{
if (!m_widget.isNull()) m_widget->setValue(val*2);
});

信号槽连接的开销是quantified in this answer .

关于c++ - 使用 Qt 信号和槽与直接调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21895269/

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