QGraphicsItems 是 Qt 框架中用于表示图形视图框架中的各种图形项的基类。它们可以是简单的形状、文本、图像,也可以是复杂的自定义图形项。
QSignalMapper 是一个方便的类,用于将多个信号映射到一个槽函数,并且可以在槽函数中区分是哪个信号触发了该槽。这在处理多个相似对象的事件时非常有用。
类型:
应用场景:
假设我们有一个 QGraphicsView,其中有多个 QGraphicsRectItem,我们希望在点击每个矩形时显示其 ID。
#include <QApplication>
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsRectItem>
#include <QSignalMapper>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QGraphicsScene scene;
QGraphicsView view(&scene);
QSignalMapper *signalMapper = new QSignalMapper(&view);
for (int i = 0; i < 5; ++i) {
QGraphicsRectItem *rectItem = scene.addRect(QRectF(0, 0, 50, 50));
rectItem->setPos(i * 60, 0);
connect(rectItem, &QGraphicsRectItem::mousePressEvent, signalMapper, QOverload<QGraphicsSceneMouseEvent *>::of(&QSignalMapper::map));
signalMapper->setMapping(rectItem, i);
}
connect(signalMapper, QOverload<int>::of(&QSignalMapper::mapped), [](int id) {
qDebug() << "Clicked item with ID:" << id;
});
view.show();
return app.exec();
}
问题1:信号未正确映射
setMapping
方法设置了正确的映射关系。问题2:槽函数未触发
mapped
信号未正确连接到槽函数。通过上述方法,可以有效解决在使用 QSignalMapper 进行 QGraphicsItems 之间通信时可能遇到的问题。
领取专属 10元无门槛券
手把手带您无忧上云