关于QGraphicsObject类的一个诡异问题

a835941119 2015-07-02 08:33:30
我自写了一个类ClockHand,父类是QGraphicsObject。
paint()函数里画了两个矩形,但是它们的形状却出乎意料,请大神指教!
clockhand.h
#ifndef CLOCKHAND_H
#define CLOCKHAND_H

#include <QGraphicsObject>

class ClockHand : public QGraphicsObject
{
public:
explicit ClockHand();
public:
QRectF boundingRect() const;
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
protected:
void dragEnterEvent(QGraphicsSceneDragDropEvent *event);
void dragLeaveEvent(QGraphicsSceneDragDropEvent *event);
void dropEvent(QGraphicsSceneDragDropEvent *event);
private:
QColor color;
bool dropOver;
//QPoint *shape;
};

#endif // CLOCKHAND_H


clockhand.cpp
#include "clockhand.h"
#include <QtGui>


ClockHand::ClockHand() : color(Qt::white),dropOver(false)
{
setAcceptDrops(true);
}

QRectF ClockHand::boundingRect() const
{
return QRectF(-21,-66,21,6);
}

void ClockHand::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
Q_UNUSED(option);
Q_UNUSED(widget);
painter->setRenderHint(QPainter::Antialiasing);
painter->setBrush(dropOver ? color.light(140) : color);
painter->drawRect(-9,-9,25,25);
painter->drawRect(-20,-65,20,5);
}

void ClockHand::dragEnterEvent(QGraphicsSceneDragDropEvent *event)
{
if(event->mimeData()->hasColor())
{
event->setAccepted(true);
dropOver = true;
update();
}
else
{
event->setAccepted(false);
}
}

void ClockHand::dragLeaveEvent(QGraphicsSceneDragDropEvent *event)
{
Q_UNUSED(event);
dropOver = false;
update();
}

void ClockHand::dropEvent(QGraphicsSceneDragDropEvent *event)
{
dropOver = false;
if(event->mimeData()->hasColor())
color = qvariant_cast<QColor>(event->mimeData()->colorData());

update();
}

main.cpp
#include "coloritem.h"
#include <QApplication>
#include "coloritem.h"
#include "clock.h"
#include <QtGui>
#include "clockhand.h"

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));

QGraphicsScene *scene = new QGraphicsScene(-500,-500,1000,1000);
// ColorItem *c1=new ColorItem;
// ColorItem *c2=new ColorItem;
// c1->setPos(60,40);
// c2->setPos(80,40);
// Clock *clock = new Clock;
// clock->setPos(200,200);
// QPoint secPolygon[4] = {QPoint(0,5),QPoint(-20,-15),QPoint(0,-65),QPoint(20,-15)};
ClockHand *secHand = new ClockHand();
secHand->setPos(-100,0);
// scene->addItem(c1);
// scene->addItem(c2);
// scene->addItem(clock);
scene->addItem(secHand);

QGraphicsView view(scene);
view.setViewportUpdateMode(QGraphicsView::BoundingRectViewportUpdate);
view.show();

return a.exec();
}


结果:
大的矩形是:painter->drawRect(-9,-9,25,25);
小的矩形是:painter->drawRect(-20,-65,20,5);
为什么会这样?
...全文
220 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
a835941119 2015-07-03
  • 打赏
  • 举报
回复
引用 1 楼 yangsh3002 的回复:
很正常啊,诡异在哪儿
我脑子有包,自己理解错了,以为drawRect的后两个参数是右下角坐标,其实是长和宽。 谢谢。结贴。
a835941119 2015-07-03
  • 打赏
  • 举报
回复
引用 1 楼 yangsh3002 的回复:
很正常啊,诡异在哪儿
按理来说大的矩形不对啊,不应该这么小。
yangsh3002 2015-07-02
  • 打赏
  • 举报
回复
很正常啊,诡异在哪儿

16,213

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧