добавление пользовательского QGraphicsItem в сцену отключить ScrollBarAsNeeded и параметры выравнивания

Пользовательский элемент 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 и опций выравнивания.

Спасибо!

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);
}
}

Я думаю, что это немного чище, но решать вам.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]