Qt:如何使不兼容的发送方/接收方参数兼容?

Qt: How to make Incompatible sender/receiver arguments compatible?

本文关键字:方参数 参数 何使 不兼容 Qt      更新时间:2023-10-16

这是我使用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() );
});