【问题标题】:adding custom QGraphicsItem to Scene disable ScrollBarAsNeeded and alignment options将自定义 QGraphicsItem 添加到场景禁用 ScrollBarAsNeeded 和对齐选项
【发布时间】:2012-11-10 05:13:32
【问题描述】:

自定义项目 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 和对齐选项。

谢谢!

【问题讨论】:

  • 什么是DeafultX、DeafultY、DeafultW和DeafultH?
  • 它们是 (0,0,100,100)。我还在图形视图中将滚动条设置为始终打开,它显示但已禁用 - 这意味着我无法使用它。
  • 尝试让你的边界矩形函数返回QRectF(x, y, w, h)
  • 是的,成功了,非常感谢。你能解释一下为什么吗?

标签: c++ qt qgraphicsview qgraphicsscene


【解决方案1】:

您的边界矩形不太正确。假设您的项目是矩形的,您的边界矩形应该与您在绘画事件中绘制的矩形相同。所以在你的绘画活动中,你应该可以打电话给painter-&gt;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);
    }
}

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

【讨论】:

    猜你喜欢
    • 2015-04-17
    • 1970-01-01
    • 1970-01-01
    • 2011-05-09
    • 2012-09-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-09
    • 1970-01-01
    相关资源
    最近更新 更多