Mein erster Beitrag und das nach nur wenigen Tagen Qt-Programmierung. Ich versuche mich kurz zu halten
und möglichst korrekt das Problem zu beschreiben.
Der Grundlegende Aufbau sieht wie folgt aus.
Mainwindow -> QGraphicsView -> QGraphicsScene.
In der QGS werden CAD-Zeichnungen, PDFs, Tiffs etc dargestellt. CAD-Zeichnungen mit OpenGl Unterstützung.
Implementiert ist in der QGV ein Zoom über das Mausrad und DragMode per Linksklick.
Anforderung: Bei Klick auf einen Button muss Zoom über Rubberband (Linksklick) und gleichzeitiges Verschieben über Rechtsklick möglich sein.
Um nicht die QMouseEvents überschreiben zu müssen habe ich eine QGV in meine QGS gelegt.
QGraphicsScene->addWidget(QGraphicsView);
Die QGraphicsView ist transparent. Nur drüberlegen geht leider nicht, das sonst die OpenGl Darstellung nicht möglich ist und ich nur eine weiße QGS sehe.
Wenn der Button wieder geklickt wird, wird die QGV ~QGV() gelöscht.
Der Zoom über Rechtecht(Rubberband) funktioniert.
Zum Problem:
Ich habe die 3 Standard-MouseEvents (Press,Move,Release). Bei Rechtsklick wird eine gesonderte Behandlung ausgeführt.
Die MouseEvents werden ausgeührt, aber es bewegen sich keine Scrollbars,... Ich habe bereits mit dem Debugger überprüft ob
Variablenwerte etc stimmen. Alles in Ordnung. Ohne Debugger bekomme ich von MSVC 08 nach ein paar Sekundenbruchteilen folgende Fehlermeldung:
Eine Ausnahme (erste Chance) bei 0x7c920698 in "Programmname".exe: 0xC00000FD: Stack overflow.
Kann mir jemand weiterhelfen?
Code:
void TransparenteQGraphicsView::mousePressEvent(QMouseEvent* event)
Code: Alles auswählen
...
if (event->button() == Qt::RightButton) {
LastPanPoint = event->pos();
setCursor(Qt::ClosedHandCursor);
rechtsklick = true;
}
...
Code: Alles auswählen
if(!LastPanPoint.isNull())
{
if (rechtsklick == true)
{
p_centerF = ptr_Parent->mapToScene(ptr_Parent->viewport()->rect().center()) ;
delta = mapToScene(LastPanPoint) - mapToScene(event->pos());
LastPanPoint = event->pos();
ptr_Parent->SetCenter(p_centerF + delta);
}
}
Code: Alles auswählen
...
else if ( event->button() == Qt::RightButton)
{
setCursor(Qt::CrossCursor);
LastPanPoint = QPoint();
rechtsklick = false;
}
event->accept();
...
void QGraphicsView::SetCenter(const QPointF& centerPoint)
Code: Alles auswählen
QRectF visibleArea = mapToScene(rect()).boundingRect();
//Get the scene area
QRectF sceneBounds = sceneRect();
double boundX = visibleArea.width() / 2.0;
double boundY = visibleArea.height() / 2.0;
double boundWidth = sceneBounds.width() - 2.0 * boundX;
double boundHeight = sceneBounds.height() - 2.0 * boundY;
//The max boundary that the centerPoint can be to
QRectF bounds(boundX, boundY, boundWidth, boundHeight);
if(bounds.contains(centerPoint)) {
//We are within the bounds
CurrentCenterPoint = centerPoint;
} else {
//We need to clamp or use the center of the screen
if(visibleArea.contains(sceneBounds)) {
//Use the center of scene ie. we can see the whole scene
CurrentCenterPoint = sceneBounds.center();
} else {
CurrentCenterPoint = centerPoint;
//We need to clamp the center. The centerPoint is too large
if(centerPoint.x() > bounds.x() + bounds.width()) {
CurrentCenterPoint.setX(bounds.x() + bounds.width());
} else if(centerPoint.x() < bounds.x()) {
CurrentCenterPoint.setX(bounds.x());
}
if(centerPoint.y() > bounds.y() + bounds.height()) {
CurrentCenterPoint.setY(bounds.y() + bounds.height());
} else if(centerPoint.y() < bounds.y()) {
CurrentCenterPoint.setY(bounds.y());
}
}
}
//Update the scrollbars
centerOn(centerPoint);
Edit: Zur Information: Qt: 4.7.0 und Mircrosoft Visual Studios 2008, falls weiter Informationen benötigt werden einfach fragen