Qt Anfänger QPainter und QRect
Wie würde ich mich über ein viereck zeichnen?
Ich habe versucht, zwei verschiedene Arten;
void MyWidget::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
painter.setPen(Qt::black);
QRect rect = QRect(290, 20, 70, 40);
painter.drawText(rect, Qt::AlignCenter,
"Data");
painter.drawRect(rect);
}
Welche gut funktioniert (auch wenn die parameter nicht benannt noch verwendet), aber ich don ' T wollen, verwenden Sie die QPaintEvent * ich habe keine Verwendung für Sie.
Also versuchte ich einfach umbenennen, meine Funktion;
void MyWidget::draw()
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
painter.setPen(Qt::black);
QRect rect = QRect(290, 20, 70, 40);
painter.drawText(rect, Qt::AlignCenter,
"Data");
painter.drawRect(rect);
}
Diese nicht mehr angezeigt wird nichts (hat aber keine Fehler).
Warum sollte es nicht funktionieren, wenn ich nicht verwenden, QPaintEvent * ??
- Warum erwarten Sie, dass eine zufällig benannte Funktion, die aufgerufen werden, etwas zu tun? Deine erste Methode ist gut. Nicht die Benennung der Parameter, die Sie nicht brauchen (noch) ist sowohl rechtliche und idiomatischer C++.
- Ok, würde es möglich sein, die erste Methode zu arbeiten, wenn ich nicht die parameter, noch gehalten, der rest gleich?
- Nein, dieser parameter ist notwendig, ob Sie es verwenden oder nicht. Ich verstehe nicht, warum würden Sie wollen, um es zu entfernen - es muss nicht kostet Sie nichts, es zu ignorieren.
- Es bewirkt, dass Probleme, die für mich später in meinem code, ich habe noch weitere Parameter übergeben, d.h. const QString &Daten. Gibt es einen alternativen Weg, um ein Rechteck zu zeichnen, Weg vom Ereignis-Parameter? Vielen Dank für Ihre Antworten.
- Die Signatur für event-Funktionen ist fest, Sie können Sie nicht ändern, bei allen (außer vielleicht für das hinzufügen von Parametern mit default-Werten, aber ich würde es nicht tun, auch wenn es funktioniert). Sie müssen beschreiben Sie Ihr problem genauer in deiner Frage, es sieht aus wie Sie versuchen, etwas zu tun "der falsche Weg".
- Ich habe einen detailsForm.cpp wo der Benutzer die details zu einem Paket. Wenn diese geschickt in die mainwindow.cpp die Paketdaten sind in einer neuen Registerkarte angezeigt. Ich hatte es gut funktioniert, wenn ich nur mit QTextEdit. Ich wollte dies ändern und QGraphicsView und zeigt die Paketdaten im inneren der Rechtecke, die das Paket realistischer Aussehen. Du hast Recht über mich, über dies der falsche Weg tbh. Ich bin einfach nur Herumspielen versucht, es herauszufinden.
- Wenn Sie für den Wechsel von widgets zu verwenden qgraphics, dann warum nicht einfach QGraphicsRectItem oder Unterklasse eine Grafik posten?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das paint-Ereignis ist die Methode, die aufgerufen wird, die von der paint-system, wenn Sie ein widget neu gezeichnet werden muss. Das ist, warum benennen einfach Ihre eigene Methode nicht funktioniert. Es wird nie aufgerufen, die von der paint-system.
Sollten Sie wirklich mit den
QPaintEvent
. Es gibt Ihnen die rect, der muss gezogen werden. Diese rect-richtet sich nach der Größe des widgets, so dass anstelle der Verwendung eines expliziten rect in Ihre paint-event, setzen Sie Ihr widget auf die richtige Größe. Ein paint-Ereignis generiert wird, sollte Ihr widget immer bewegen, vergrößern, verkleinern, etc.Nun, wenn Sie wollen, trennen Sie Ihre Farbe-Logik in einer anderen Methode, ist das in Ordnung. Aber würden Sie brauchen, um es von der paint-Ereignis:
Wenn Sie möchten, um vollständig zu umgehen, die paint-events, wie Sie sagte, und nur wollen, erstellen Sie eine statische Rechteck, um anzuzeigen, eine Möglichkeit ist, ziehen Sie einfach einmal zu einer pixmap und zeigen Sie es in einem QLabel:
Alle Daten, die Ihr
paintEvent()
muss zugänglich sein sollten als Felder von der übergeordneten Klasse, in deinem Fall, die private Felder vonMyWidget
. Diese privaten Felder ausgesetzt werden können, um Kunden vonMyWidget
über "setter", die würden die Daten-Werte vor dem Aufrufupdate()
aufMyWidget
was löst einen Anruf anpaintEvent()
.Diese playlist enthält die besten Qt tutorials , Start-tutorial, 74 könnte für Sie sinnvoll sein (Qpainter und QPen), übung 75 ist wie zeichnen von Rechtecken mit QRect.
Sowie @Mat sagte Sie: die "event" ist der richtige Weg, um zu starten Maler.
QPainter kann nur evoziert werden, nachdem ein QPaintEvent Ereignis, trägt die sichere region, wo das Objekt gezeichnet werden.
So müssen Sie eine andere Strategie für den transport Ihrer Daten, zu helfen
Ich schlage vor, eine einfache Methode, die angepasst werden kann für viele Fälle.
widget.cpp
widget.h
window.cpp
Fenster.h
main.cpp
Wie Sie sehen können, in der code ausgeführt wird, ein timer, außerhalb des Objekts "widget"
alle 10ms sendet ein repaint das widget neu zu zeichnen Sie ein "Rechteck" mit einer anderen Größe, und alle 20 Zyklen (200 MS) ändert den text "Hallo" "Welt"
In diesem Beispiel können Sie sehen, dass in irgendeiner Weise benötigen, überschreiben Sie die QPainterDevice Architektur.
Möglicherweise bemerken Sie auch, dass die "event" innerhalb der "paintEvent" zum schweigen gebracht und nicht direkt verwendet, aber es ist wichtig zum ausführen einer Sequenz QPainter.
Überschreiben der paintEvent () - Funktion von einem widget können Sie zum anpassen der widget-und diese Funktion wird aufgerufen, in regelmäßigen Abständen neu zu zeichnen, das widget. Daher wird jeder Zeichnung vorgenommen werden, sollten in dieser Funktion. Allerdings überschreiben paintEvent() kann dazu führen, dass einige performance-Probleme. Ich würde lieber mit einer QGraphicsScene und QGraphicsView dann würde ich fügen Sie ein Rechteck in der Szene ist der gemeinsame Weg, das zu tun diese Art der Zeichnung Zeug. Bitte überprüfen Sie die GraphicsView Rahmen
http://qt-project.org/doc/qt-4.8/graphicsview.html