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"