0

自定义项目 cpp:

MapNode::MapNode(qreal x, qreal y, qreal w, qreal h, QGraphicsItem *parent)
{
    this->x = x;
    this->y = y;
    this->w = w;
    this->h = h;
}

QRectF MapNode::boundingRect() const
{
    return QRectF(DeafultX, DeafultY, DeafultW, DeafultH);
}

void MapNode::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    QBrush redBrush(Qt::red);
    QPen blackPen(Qt::black);
    blackPen.setWidth(1);
    painter->setBrush(redBrush);
    painter->setPen(blackPen);
    painter->drawRect(x,y,w,h);
}

添加到场景:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    scene = new QGraphicsScene(this);
    ui->graphicsView->setScene(scene);

    QBrush redBrush(Qt::red);
    QPen blackPen(Qt::black);
    blackPen.setWidth(1);

    for(int i = 0; i < 992; i+=62)
    {
        for(int j = 0; j < 992; j+=62)
        {
            QGraphicsItem *myItem = new MapNode(i,j,60,60);
            scene->addItem(myItem);
            //scene->addRect(i,j,60,60,blackPen,redBrush); //working fine
        }
    }
}
  • 添加我的项目时,他们从图形视图的中间开始绘制(我将图形视图对齐设置为居中,这与 addRect 配合得很好),当添加更多项目时,图形视图屏幕可以查看滚动条正在工作,当添加我的项目他们被禁用。
  • 我试图从图形视图中获得与在场景中添加 rect (addRect) 时相同的行为,尤其是 ScrollBarAsNeeded 和对齐选项。

谢谢!

4

1 回答 1

0

您的边界矩形不太正确。假设您的项目是矩形的,您的边界矩形应该与您在绘画事件中绘制的矩形相同。所以在你的绘画活动中,你应该可以打电话painter->drawRect(boundingRect());

请注意,您正在做的另一种方法是利用 QGraphicsItem 的位置(QGraphicsItem::setPos()):

for(int i = 0; i < 992; i+=62)
{
    for(int j = 0; j < 992; j+=62)
    {
        QGraphicsItem *myItem = new MapNode(0, 0, 60, 60);
        myItem->setPos(i, j);
        scene->addItem(myItem);
    }
}

我认为这有点清洁,但这取决于你。

于 2012-11-09T21:13:32.850 回答