QGraphicsRectItem item(scene);这行为什么报错
如果在使用 QGraphicsRectItem(item(scene))
创建 QGraphicsRectItem
时遇到错误,可能是由于以下几个原因:
scene
没有初始化: 确保在调用QGraphicsRectItem
之前已经正确地创建并初始化了QGraphicsScene
。例如,你需要在构造函数或者某个地方显式地设置scene
:QGraphicsScene scene; QGraphicsRectItem item(scene);
类型不匹配: 如果传递给
QGraphicsRectItem
的不是QGraphicsScene *
类型的对象,可能会导致编译错误。确保传递的是指向QGraphicsScene
的指针。异常处理: 可能是上文的操作出现了未捕获的异常,导致无法正常创建
QGraphicsRectItem
。检查是否有其他代码段可能导致错误,如内存分配失败、无效的参数等。代码结构问题: 如果
QGraphicsRectItem
是在一个信号槽函数中使用的,确保信号已经被正确连接并且触发了正确的事件。
如果你能提供更多关于错误的详细信息,我可以帮助你找到更具体的解决方案。
设置我重写的QGraphicsRectItem不能移动超出scene场景
你可以通过重写QGraphicsRectItem的mouseMoveEvent()函数来实现,当鼠标移动超出场景时,将其限制在场景内。下面是一个示例:
class MyRectItem(QGraphicsRectItem):
def __init__(self, parent=None):
super().__init__(parent)
self.setFlag(QGraphicsItem.ItemIsMovable, True) # 允许移动
def mouseMoveEvent(self, event):
# 获取当前场景的边界矩形
scene_rect = self.scene().sceneRect()
# 获取当前图形项的边界矩形
item_rect = self.boundingRect()
# 获取当前鼠标位置
pos = event.scenePos()
# 如果超出场景,则将其限制在场景内
if not scene_rect.contains(pos.x() - item_rect.width() / 2, pos.y() - item_rect.height() / 2,
item_rect.width(), item_rect.height()):
if pos.x() < scene_rect.left() + item_rect.width() / 2:
pos.setX(scene_rect.left() + item_rect.width() / 2)
elif pos.x() > scene_rect.right() - item_rect.width() / 2:
pos.setX(scene_rect.right() - item_rect.width() / 2)
if pos.y() < scene_rect.top() + item_rect.height() / 2:
pos.setY(scene_rect.top() + item_rect.height() / 2)
elif pos.y() > scene_rect.bottom() - item_rect.height() / 2:
pos.setY(scene_rect.bottom() - item_rect.height() / 2)
# 将图形项移动到限制后的位置
self.setPos(pos)
# 否则,调用父类中的mouseMoveEvent()函数
else:
super().mouseMoveEvent(event)
在这个示例中,我们首先允许图形项移动,然后重写mouseMoveEvent()函数。在该函数中,我们获取当前场景的边界矩形、当前图形项的边界矩形和鼠标位置,并检查是否超出场景。如果超出场景,则将其限制在场景内,并将图形项移动到限制后的位置。否则,我们调用父类中的mouseMoveEvent()函数,以便处理其他移动操作。
if(roleDataMap.contains(Qt::DisplayRole) && roleDataMap[Qt::DisplayRole].toString() == "TX") { QPointF pos = mapToScene(event->pos()); QGraphicsItem* item = new QGraphicsRectItem(pos.x(), pos.y(), 32, 32); item->setBrush(Qt::red); scene()->addItem(item); event->acceptProposedAction(); } 显示maptoscene,setBrush,Scen为未定义标识符
这段代码中的mapToScene
、setBrush
和scene
都是QGraphicsItem
类的成员函数,需要在QGraphicsItem
的子类中使用。如果您想在这段代码中使用这些函数,需要将其放置在QGraphicsItem
的子类中,并确保包含了相应的头文件。例如,您可以这样重构代码:
#include <QGraphicsRectItem>
#include <QMouseEvent>
#include <QGraphicsScene>
class MyGraphicsItem : public QGraphicsRectItem
{
public:
using QGraphicsRectItem::QGraphicsRectItem;
protected:
void mousePressEvent(QGraphicsSceneMouseEvent* event) override
{
QMap<int, QVariant> roleDataMap = event->mimeData()->retrieveData("application/x-qabstractitemmodeldatalist").value<QVariantList>().at(0).value<QVariantMap>();
if (roleDataMap.contains(Qt::DisplayRole) && roleDataMap[Qt::DisplayRole].toString() == "TX") {
QPointF pos = mapToScene(event->pos());
QGraphicsItem* item = new QGraphicsRectItem(pos.x(), pos.y(), 32, 32);
item->setBrush(Qt::red);
scene()->addItem(item);
event->acceptProposedAction();
}
}
};
在新的MyGraphicsItem
类中,我们重载了mousePressEvent
函数,以便捕获鼠标事件并执行相应的操作。同时,我们还包含了QGraphicsRectItem
的构造函数,并使用using
语句将其继承过来,以便在构造函数中使用。这样,您就可以在MyGraphicsItem
的构造函数中进行自定义设置,如下所示:
MyGraphicsItem* item = new MyGraphicsItem(0, 0, 32, 32);
请注意,这里的mapToScene
、setBrush
和scene
都是从QGraphicsItem
类继承而来的成员函数。如果您在使用时出现未定义标识符的错误,可能是因为您没有包含相应的头文件或没有正确使用命名空间。请检查您的代码并进行必要的更改。