2012-11-09 1 views
0

사용자 정의 항목 CPP :추가 지정 QGraphicsItem는 ScrollBarAsNeeded 및 정렬 옵션을 사용하지

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와 잘 맞습니다), 항목을 더 추가 할 때도 그래픽보기 화면에서 스크롤 막대가 작동하는지 확인할 수 있습니다. 항목을 추가하면 비활성화됩니다.
  • 나는 장면 (특히 ScrollBarAsNeeded 및 정렬 옵션)에 rect (addRect)를 추가 할 때 그래픽보기에서 동일한 동작을 얻으려고합니다.

감사합니다.

+0

DeafultX, DeafultY, DeafultW 및 DeafultH는 무엇입니까? – Anthony

+0

그들은 (0, 0, 100, 100)입니다. 스크롤 막대를 그래픽보기에서 항상 켜기로 설정하면 표시되지만 비활성화되었으므로 사용할 수 없습니다. – GoldenAxe

+0

바운딩 rect 함수가'QRectF (x, y, w, h)'를 리턴하도록하십시오. – Anthony

답변

0

경계 사각형이 올바르지 않습니다. 아이템이 직사각형 모양이라면, 경계 사각형은 페인트 이벤트에서 그린 직사각형과 같아야합니다. 그래서 페인트 경우에, 당신은 무슨 일을하는지에 대한 대안 접근 방식은 QGraphicsItem의 위치 (QGraphicsItem::setPos())를 활용할 것을 painter->drawRect(boundingRect());

주를 호출 할 수 있어야한다 :

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

나는이 생각 조금 더 깨끗하지만, 당신에게 달려 있습니다.