QTransform richtig mappen (map event) in QAbstractScrollArea

Alles rund um die Programmierung mit Qt
Antworten
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

QTransform richtig mappen (map event) in QAbstractScrollArea

Beitrag von patrik08 »

QTransform solte mich doch richtig den mousePressEvent mappen od die posizion uebersetzen... warum geht es nicht.
Wo ist der fehler?

Wie bringe ich die richtige QPointF transormiert im aktuellen QTransform oder scale...


Code: Alles auswählen

#include <QtGui>

class EditArea : public QAbstractScrollArea
{
    Q_OBJECT
//
public:
 EditArea( QWidget *parent = 0 , int dimension = 800 )
  : QAbstractScrollArea(0),workArea(dimension,dimension),
    scaleFaktor(0.8),mesure(dimension)
{
  mcurrent  = QTransform(scaleFaktor,0.,0.,scaleFaktor,0.,0.);
  dotChain << mcurrent.map(QPointF(44,55)) << mcurrent.map(QPointF(100,155));
  adjustScrollbars();
}
int xOffset() const { return horizontalScrollBar()->value(); }
int yOffset() const { return verticalScrollBar()->value(); }

protected:
    
void paintEvent( QPaintEvent *Event )
{
  const int y = yOffset();
  const int x = xOffset();
  QTransform mati(scaleFaktor,0.,0.,scaleFaktor,0.,0.);
  QPainter *p = new QPainter( viewport() );
  p->setRenderHint(QPainter::Antialiasing, true);
  p->setPen(Qt::NoPen);
  p->setBrush(Qt::lightGray);
  p->drawRect(Event->rect());
  p->setWorldTransform(mati,false);
  p->translate(-x,-y);
    
    QFont fontText("Verdana",12,QFont::StyleItalic);
    fontText.setStyleStrategy(QFont::PreferBitmap);
    
  p->setBrush(Qt::yellow);
  p->drawRect(QRect(QPoint(1,11),workArea));
    for (int i = 0; i < dotChain.size(); ++i) {
        QPainterPath textPath;
        textPath.addText (dotChain.at(i),
                          fontText,QString("Click here. DoubleClick clear."));
        textPath.addText (dotChain.at(i) + QPointF(0,1 * 15),
                         fontText,QString("Scale Faktor = %1 (mouse wheel).").arg(scaleFaktor));
        textPath.addText (dotChain.at(i) + QPointF(0,2 * 15),
                         fontText,QString("Area  yellow = %1x%1.").arg(mesure * mcurrent.m11()));
        p->setBrush(Qt::darkGreen);
        p->drawPath(textPath);  
    }
  mcurrent = mati;
  p->end();
}

void mousePressEvent ( QMouseEvent *e )
{
    QPointF newpos = mcurrent.map(e->pos());
    dotChain << newpos;
    viewport()->update();
}
void mouseDoubleClickEvent ( QMouseEvent *e )   
{
    dotChain.clear();
    viewport()->update();
}
void resizeEvent(QResizeEvent *e)
{
    adjustScrollbars();
}

void adjustScrollbars()
{
     mcurrent  = QTransform(scaleFaktor,0.,0.,scaleFaktor,0.,0.);
     workArea = QSize(mesure * mcurrent.m11() , mesure * mcurrent.m11() );
     QSize areaSize = viewport()->size();
     QSize  widgetSize = workArea;
     setHorizontalScrollBarPolicy ( Qt::ScrollBarAlwaysOn );
     verticalScrollBar()->setPageStep(widgetSize.height());
     horizontalScrollBar()->setPageStep(widgetSize.width());
     verticalScrollBar()->setRange(0, widgetSize.height() - areaSize.height());
     horizontalScrollBar()->setRange(0, widgetSize.width() - areaSize.width());
     setHorizontalScrollBarPolicy ( Qt::ScrollBarAlwaysOn );
}

void wheelEvent (QWheelEvent * event)
{
  qreal docksscale = scaleFaktor;
  if (event->delta() > 1) {
      docksscale = docksscale + 0.05; 
  } else {
      docksscale = docksscale - 0.05; 
  }
  if (docksscale < 0.45 || docksscale > 5) {
   return;
  } else {
      scaleFaktor = docksscale;
      adjustScrollbars();
      viewport()->update();
  }
 
}

private:
    int mesure;
    QTransform mcurrent;
    QList<QPointF> dotChain;
    QSize workArea;
    qreal scaleFaktor;
signals:
public slots:
};


int main(int argc, char **argv)
{
	QApplication a(argc, argv);
	EditArea w;
	w.show();
	return a.exec();
}

#include "main.moc"
.........................
speack português italiano deutsch english castellà qt
Antworten