【发布时间】:2014-03-20 15:44:40
【问题描述】:
假设我有一个带有滑块的主窗口和一个在该窗口内的小部件,该窗口带有一个名为setValue(int) 的方法。每次滑块的值发生变化时,我都想调用这个方法。
以下两种实现方式有什么实际区别:
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 之前对其进行处理。
有没有第二种方案更好的场景?
【问题讨论】:
-
你是怎么接到
MainWindow::on_slider_valueChanged的电话的?这才是重点。信号提供事件及其处理程序的抽象。如果您没有瓶颈,则不要关心性能(至少如果它影响您的设计),尤其是 GUI 代码。 GUI 代码绝对与性能无关。 -
@Paranaix:
MainWindow::on_slider_valueChanged被调用是因为QMetaObject::connectSlotsByName()自动生成此连接。我关心的不是性能,而是设计。我试图找出为什么一个比另一个更好,如果它有任何区别的话。 -
信号和槽方法的一个明显优势是信号/槽连接在其任一端点被删除时自动且安全地断开。这意味着没有由于访问悬空指针而导致崩溃的风险(例如,如果您在某处执行了“删除 ui->widget”,您对 on_slider_valueChanged() 的下一次调用将崩溃,但示例 2 将继续运行而不会出现错误)跨度>
-
第二种方法肯定更好。在第一个中,您再引入一个实体 (on_slider_valueChanged) 只是为了调用一些体面的代码行。此外,那些将阅读您的代码的人现在必须滚动浏览所有微方法才能找出连接方案。
-
在我看来,情况正好相反。第二个更直接 - 它直接将信号与插槽连接。第一个是间接的——你将信号连接到你的自定义处理程序,然后调用槽。第一个并没有“避免一些与信号和槽相关的开销”,相反,它增加了一些开销。
标签: c++ qt user-interface class-design signals-slots