Qt:如何使不兼容的发送方/接收方参数兼容?
Qt: How to make Incompatible sender/receiver arguments compatible?
这是我使用connect的代码,
connect(myTimer, SIGNAL(timeout()), ui.widget_2, SLOT(paintEvent(QPaintEvent *)));//draw lines
我用它来去插槽paintEvent(QPaintEvent *(,在那里我可以画一些线。但是我在调试或运行程序时有一条消息,即
QObject::connect: Incompatible sender/receiver arguments
QTimer::timeout() --> MapWidget::paintEvent(QPaintEvent*)
主窗口.cpp
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
myTimer = new QTimer(this);
...
connect(myTimer, SIGNAL(timeout()), ui.widget_2, SLOT(paintEvent(QPaintEvent *)));//draw lines
...
}
ui.widget_2是mapWidget的一个实例。
地图小部件.cpp
void MapWidget::paintEvent(QPaintEvent *)
{
QPainter painter(this);
...
}
我知道信号和插槽的参数是不兼容的,但我不知道如何使它们兼容。似乎 MapWidget::p aintEvent(QPaintEvent*( 的参数不能忽略,我也不能向 timeout(( 添加参数。
我很困惑。
不要尝试连接到paintEvent(QPaintEvent *)
; 该方法不是插槽方法,因此即使您以某种方式能够将正确的参数传递给它,通过信号调用它也不会起作用。 而是连接到update()
槽,这将确保尽快从正确的上下文调用paintEvent(QPaintEvent *)
方法。
OP的具体用例:使用QTimer绘制小部件。
Jeremy Friesner的答案对于这个用例是正确的。
标题问题"如何使不兼容的发送方/接收方参数兼容">的一般答案?
使用新的Qt 5版本QObject::connect()
:https://doc.qt.io/qt-5/signalsandslots-syntaxes.html
Qt 5 样式连接可以进行隐式转换:
// OK: The new version of connect() lets the compiler convert int to double
connect(slider, &QSlider::valueChanged,
doubleSpinBox, &QDoubleSpinBox::setValue);
// ERROR: The old version of connect() needs the parameter types to be exactly the same
connect(slider, SIGNAL(valueChanged(int)),
doubleSpinBox, SLOT(setValue(double)));
此外,您可以使用lambda 表达式连接到其参数与信号参数真正不兼容的插槽:
// Using QTimer::timeout() to trigger a call to QLabel::setText(const QString&)
connect(timer, &QTimer::timeout, [=] {
label->setText( QTime::currentTime()->toString() );
});
相关文章:
- 模板参数推导失败,函数参数/参数不匹配
- 有人可以帮助我理解这些参数/参数吗?
- 为什么具有 2 个参数参数的构造函数接受复制对象作为 1 个参数参数?
- 当超出列时,clang格式强制每个参数/参数拥有自己的行?
- 常量和非常量函数作为模板参数参数
- 功能指针参数参数转换为const
- C 从参数参数包创建向量或列表
- C 中函数参数/参数的分辨率
- 操作员[]作为成员函数的正确模板参数/参数是什么?
- 为什么可以将其他类型变量用作C 中常量参考参数参数的参数
- 如何从Windows CMD运行可执行文件并将其传递给文件输入的参数参数和重定向
- 使用 {} 作为默认参数参数类型
- 将多个cmd.exe参数/参数传递给Shellexecute(ex)
- C 参数参数未更新
- 如何识别模板参数参数是否是模板内结构中另一个类的实例?C++
- 在不使用"new"的情况下实例化参数参数中的对象
- 由 pthread_create() 调用的函数的多个参数 - 参数是函数指针
- 模板模板参数参数名称用法
- 重新定义默认参数:参数 2
- 检查调用方和参数是否相同