QTransform richtig mappen (map event) in QAbstractScrollArea
Verfasst: 26. September 2008 10:17
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...
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"