Qt:Signal调用的函数的默认参数
Posted
技术标签:
【中文标题】Qt:Signal调用的函数的默认参数【英文标题】:Qt: Default Parameters for function called by Signal 【发布时间】:2016-11-14 21:24:04 【问题描述】:当我尝试将具有一个默认参数和一个非默认参数的函数连接到 QSlider 时收到此错误:
230: error: static assertion failed: The slot requires more arguments than the signal provides.
Q_STATIC_ASSERT_X(int(SignalType::ArgumentCount) >= int(SlotType::ArgumentCount),
^
这是否意味着连接到函数的 QWidget 不能支持默认参数?有没有办法解决这个问题?
这是我的尝试:
void MainWindow::connections()
connect(sliderA, &QSlider::valueChanged, this, &MainWindow::someSliderChanged);
connect(sliderB, &QSlider::valueChanged, this, &MainWindow::someSliderChanged);
void MainWindow::someSliderChanged(int position, char state = 0)
QObject* sender = QObject::sender();
if (sender == sliderA || state == 1)
thing1->setValue(position);
else if (sender == sliderB || state == 2)
thing2->setValue(position);
void MainWindow::default()
someSliderChanged(50, 1)
someSliderChanged(70, 2)
【问题讨论】:
我认为不可能,但您可以使用单个参数创建第二个插槽,然后调用您的原始插槽。如果你喜欢我打赌你可以将第二个插槽设为 lambda。 你也可以考虑 struct SliderConfiguration int position;字符状态; ,然后将插槽设置为 someSliderChanged(SliderConfiguration) 【参考方案1】:这是否意味着连接到函数的 QWidget 不能支持默认参数?
来自信号槽的documentation:
信号的签名必须与接收槽的签名匹配。
因此我会说不,这是不可能的。
有没有办法解决这个问题?
例如,如果您的编译器支持 C++11,则可以使用 lambda 函数。 像这样的:
connect(sliderA, &QSlider::valueChanged, [this](int pos) someSliderChanged(pos); );
否则,定义一个没有额外参数的(让我说)forward slot并将其绑定到信号。
有关更多详细信息,请参阅 documentation 以了解 QtObject::connect
的重载。
【讨论】:
虽然我正在运行 C++11,并且您的connect()
解决方案确实编译,但 someSliderChanged
无法识别信号的 sender
,因此它不会更新,呈现此解决方案没有按我的需要工作。以上是关于Qt:Signal调用的函数的默认参数的主要内容,如果未能解决你的问题,请参考以下文章