Ich bin neu hier und möchte damit nicht ausschließen das ich die Suchfunktion noch nicht richtig beherrsche .
Ich habe ein Problem mit einer Klasse die von QGraphicsEffect erbt. Es geht um folgendes:
Stellt euch eine QGroupBox vor auf der weitere widgets liegen. Hier sei angemerkt das diese nicht mit einem Layout oder sowas ausgerichtet werden.
Die ausrichtung wird anhand eines festgelegten "Rasters" gemacht.
Sagen wir die QGroupBox ist 100x100 pixel groß und ich gebe als "rastergröße" 10x10 pixel ein, habe ich 10 virtuelle "kästchen" horizontal und vertikal,
auf denen die Widgets angeordnet werden können. Wie beim Qt Designer möchte ich jetzt ein widget per Drag and Drop Operation hinzufügen. Das geht soweit auch schon und
die widgets werden auch richtig positioniert. Während des DragMove events möchte ich dem Benutzer anzeigen wo das neue Widget platziert werden würde, wenn er jetzt
den Drop macht (also die maus los lässt). Die Anzeige wo das neue Widget hinkommen würde funktioniert insofern auch schon das das richtige Kästchen errechnet und mit einem
QGraphicsEffect gefüllt wird (ich zeichne einfach eine linie von Startpunkt zum Endpunkt mit entsprechender Linienstärke). Die Zeichenmethode des abgeleiteten QGraphicsEffects sieht wie folgt aus:
Code: Alles auswählen
void HighlightDropPositionEffect::draw(QPainter * painter)
{
//mRasterSize ist vom Typ QSizeF und wurde vorher gesetzt
QPoint offset;
const QPixmap pixmap = sourcePixmap(Qt::DeviceCoordinates, &offset);
QPen pen(mColor, (qreal)mRasterSize.height(), Qt::SolidLine, Qt::FlatCap, Qt::RoundJoin);
QTransform restoreTransform = painter->worldTransform();
painter->save();
painter->setWorldTransform(QTransform());
painter->drawPixmap(offset, pixmap);
painter->setPen(pen);
//mStartPosition und mEndPosition sind jeweils vom Typ QPoint und enthalten die
//Koordinaten wo die Linie gezeichnet werden soll.
mStartPosition.setY(mStartPosition.y() + (mRasterSize.height() / 2));
mStartPosition.setX(mStartPosition.x() + offset.x());
mStartPosition.setY(mStartPosition.y() + offset.y());
mEndPosition.setX(mStartPosition.x() + mRasterSize.width());
mEndPosition.setY(mStartPosition.y());
painter->drawLine(mStartPosition, mEndPosition);
painter->setWorldTransform(restoreTransform);
painter->restore();
}
Meine vermutung ist das bei der neu Positionierung des Effekts alle Widgets mit neu gezeichnet werden, da die CPU last stark nach oben geht dabei.
Hat jemand eine Idee wie ich das Zeichnen schneller hinbekomme? Da bei normaler Mausbewegung die Markierung der DropPosition
stark hinterher hängt, ist sie quasi wertlos. Erst wenn man 2 - 3 Sekunden auf einer Position stehen bleibt ist die richtige DropPosition
markiert.
Danke im vorraus
// edit franzf: Code-Tags eingefügt.