2016-06-10 1 views
0

내가 원한다.장면 크기를 조정하지 않고 QGraphicsView의 왼쪽에있는 사각형에 정렬하는 방법은 무엇입니까?

왼쪽과 오른쪽으로 정렬 된 일련의 직사각형을 QGraphicsView에 그려야합니다. 이 말은 rectangle i에 posion (0, y) rectangle이 있고 i + 1에 QGraphicsView의 오른쪽이 "맞닿는"정도의 위치 (0, 최대)가 있어야한다는 것입니다.

창이 크기가 조정되면 사각형의 항상 화면 오른쪽을 만지는 최대 값을 다시 계산해야합니다. 여기

내가 그것 (0, yvalue, 폭, 높이)를 추가 왼쪽 테두리에 닿을 사각형을 추가하려면 내 장면 (이를 QGraphicsView을 상속하는 클래스를 참조)

scene = new QGraphicsScene(this); 
this->setScene(scene); 
this->setAlignment(Qt::AlignTop|Qt::AlignLeft); 

추가하는 방법이다.

X의 값을 계산하여 사각형이 오른쪽 테두리에 닿도록하려면 어떻게해야합니까?

+1

QML을 사용할 수 있습니까? 나는 최근 QWraphicsView에서 QML로 전환하여 이와 같은 작업을 수행했으며 생산성에 미치는 영향은 엄청납니다. – cheez

+0

나는 QML이 정직하다는 것을 모른다. Qt 5.1.1을 사용하고 있습니다. 그게 가능해? 호환성은 어떻습니까? 나는 성능보다는 그것에 더 신경을 썼다 ... – aarelovich

+1

아, 그럼 그걸 좋아할거야 : https://doc.qt.io/qt-5/qmlapplications.html 호환성은 문제가 없다. 3 개의 데스크톱 플랫폼에서 QML 앱을 제공하지만 Qt 5.6을 사용합니다. Qt 5.1.1과의 호환성 이야기는 말할 수 없습니다. – cheez

답변

0

이 작은 예제는 원하는 정렬 (내가 보여준 것이지만 가운데, 위, 아래가 동일하게 할 것임)을 기반으로 선택 항목이나 항목 목록에서 모든 항목을 이동하고 이동해야합니다.

QRectF refRect = scene()->sceneRect(); 
QList<QGraphicsItem*> sel = allItemsYouWantAligned; // scene()->selectedItems(); for example 

foreach(QGraphicsItem* selItem, sel) 
{ 
    qreal dx = 0, dy = 0; 
    QRectF itemRect = selItem->mapToScene(selItem->boundingRect()).boundingRect(); 
    if(align_right) 
     dx = refRect.right() - itemRect.right(); 
    else 
     .. calculate either dx or dy on how you want to align 
    selItem->moveBy(dx, dy); 
} 

질문 다시 읽으십시오 - 저는 직사각형을 움직일 필요가 없지만 새로운 크고 큰 직사각형을 새로 만듭니다.

당신의 솔루션은 충분히 간단합니다. 대신 움직임의 크기를 조정하려면 - 당신은 DX 증가하여 항목에 대한 setRect() 할 것 : 좋아

QRectF r = selItem->rect(); 
r.setWidth(r.width + dx); 
selItem->setRect(r); 
+0

dx가 항상 0으로 계산되므로 이것은 작동하지 않습니다. – aarelovich

+0

@aarelovich - 이상한 캔버스와 항목의 오른쪽()면이 이미 동일하면 0 일 수 있습니다. – Thalia

+0

다시 시도해 보겠습니다. 수정 한 코드가 모두 지워지고 다시 확인해 보겠습니다. – aarelovich

0

합니다. 그래서 이것은 QGraphicsView의 resize 이벤트에 있어야합니다. 그러나 이것은 내가 원했던 것입니다 :

void AView::resized(){ 

    scene->clear(); 
    QSize newsize = this->size(); 

    qreal w = newsize.width()*.99; 
    qreal h = newsize.height()*.99; 
    this->setSceneRect(0,0,w,h); 
    scene->setSceneRect(0,0,w,h); 

    qreal rectwidth = 100; 
    qreal newx = w - rectwidth; 
    left = new QGraphicsRectItem(0,0,rectwidth,100); 
    left->setBrush(QBrush(Qt::red)); 
    right = new QGraphicsRectItem(newx,100,rectwidth,100); 
    right->setBrush(QColor(Qt::blue)); 

    scene->addItem(left); 
    scene->addItem(right); 

} 

이렇게하면 파란색 직사각형이 항상 국경에 있습니다. 마찬가지로 이미지가 늘어나지 않습니다. 오른쪽 테두리 사이에 간격이 있습니다. 크기를 조정하면 창 크기가 커지지만 this-> size()가 반환하는 크기는 화면에 표시된 "흰색 영역"보다 약간 큰 것처럼 보입니다. .99를 추가하면 실험 결과가 훨씬 향상됩니다.

+0

크기를 조정할 때마다 새 항목을 추가하려는 경우이 기능이 작동합니다. 먼저 오래된 항목을 삭제할 수 있습니다.열심히 일하는 것처럼 보입니다 :-) 왼쪽 및 오른쪽 항목에 setRect()를 사용하면 더 간단합니다 (메모리 누수를 피하십시오). – Thalia

+0

이것은 내가하고 싶었던 더 복잡한 예에 불과합니다. 그리고 네, 각 크기 조정시 항목 생성을 피하고 싶었습니다. 그러나 이것은 효과가있었습니다. 사실 장면 -> 지우기는 실제로 항목을 삭제합니다 (장면에서 지우면 좋을 것입니다.하지만 아아 ...) 그래서 내가 분명히하는 장면을하면 매번 다시 만들어야합니다. – aarelovich

+0

"명확한"무엇을 할 것으로 기대합니까? 그리고 당신의 아이템에 rect를 설정하지 않는다면,이 함수를 호출 할 때마다 프로그램은 점점 더 많은 메모리를 사용하게 될 것이고, 결국에는 충돌이 일어날 것입니다. 이것이 메모리 누수의 의미입니다. – Thalia