Paint und Layout

Alles rund um die Programmierung mit Qt
gast23
Beiträge: 103
Registriert: 11. August 2010 10:43

Paint und Layout

Beitrag von gast23 »

Hi,

kann mir bitte jemand erklären in welchem Zusammenhang das Zeichen in der PaintEvent Methode mit einem Layout steht?

Ich möchte gerne ein custom Button der sich aus speziellen Teilen zusammen setzt bauen.

MEine Basis Klasse ist QWidget. Ich habe in der Paint Methode testweiße etwas gemalt aber mir ist nicht ganz klar wie ich nun z.B. ein anderes QWidet einfügen kann und auf diesen click signal reagiere.

Muss ich das andere QWidget malen oder kann das irgendwie gemalt werden?

Also Verbindung Logik des Widget, Layout und eigenes zeichen ist mir nicht so ganz klar.

Des Weiteren wie erhalte ich genau die Font (Zum vermessen) die im Stylesheet bzw. global gültig ist?

Vielen Dank
Nvidia
Beiträge: 238
Registriert: 22. Februar 2010 21:23

Beitrag von Nvidia »

ok, wenn du deinen Button willst, wuerde ich eher von QAbstractButton oder QPushButton ableiten(oder die anderen Buttontypen, was du halt willst).
Also ein Widget ist ein Visuelles Element z.b. QLineEdit ein Eingabewidget.
QPushButton ein Button, den man klicken kann.
QWidget ist die Basisklasse zu vielen Widgets, in dem viele Standartfunktionen beschrieben sind, die dann durch Vererbung an die visuellen Elemente z.b. QLineEdit weitergegeben werden.
(So besitzen die abgeleiteten Elemente alle die Funktionen der Basisklasse und muessen nicht bei jedem Element neu definiert werden)
QWidget hat im 'Normal-Zustand' kein wirkliches Aussehen.
Es ist eher dazu gedacht abzuleiten und es seinen Wuenschen abzupassen,
da es sehr viele Standartfunktionen mit sich bringt.
ein QLayout ist dazu gedacht, verschiedene Widgets (nicht nur QWidget, sondern auch alles moegliche andere Visuelle z.b. QLineEdit zu positionieren)
z.b. QHBoxLayout ordnet die Elemente nebeneinander an.
Das QPaintEvent ist dafuer zustaendig, wie das Widget spaeter aussehen soll. Qt gibt dir das vor, was du siehst. Wenn du willst das das Widget anderes aussieht, dann muss das Widget ableiten und das PaintEvent implementieren, in die schreibst du dann wie es das Widget malen soll.
(siehe QPainter)
Diese Methode braucht nicht aufgerufen zu werden, sie wird automatisch aufgerufen, sobald du ein Objekt der Klasse erstellst.
Wenn du Widgets in anderen Widgets darstellen willst.
Also z.b. du moechtest ein QLineEdit in einem QWidget haben, dann musst du dem QLineEdit als Parent QWidget geben.
Dann wird das nur innerhalb des QWidget dargestellt und wird zerstoert sobald das QWidget zerstoert wird.
fuer deine Font:
http://doc.qt.nokia.com/4.6/qwidget.html#font-prop
solange du nichts anderes im Stylesheet gesetzt hast, ist das diese.
gruss nvidia
gast23
Beiträge: 103
Registriert: 11. August 2010 10:43

Beitrag von gast23 »

Ich habe nun die Form in meinem Widget gemalt und nun möchte ich das man auf eine bestimme Stelle klicken kann und das irgendwie merke.

WIe kann ich das anstellen?

Kann ich ein bestehendes Widget in der PaintMethode an die Stelle malen oder muss ich dies per setLayout tun?
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Du könntest dir mal das QGrahicsView & Co. ansehen, ob das deine Anforderungen erfüllt.
gast23
Beiträge: 103
Registriert: 11. August 2010 10:43

Beitrag von gast23 »

Das muss doch aber irgendwie funktionieren? Oder ist die paint Methode nur für reines 2D zeichen da?

Ein Tab z.B. wird doch auch gemalt...
Nvidia
Beiträge: 238
Registriert: 22. Februar 2010 21:23

Beitrag von Nvidia »

lern doch erstmal, wovon du sprichst.
Also wenn du das Widget klicken willst, nimmst du signal slots.
Wenn du auf das Selbe Widget zeichnen willst,
dann machst du connect clicked repaint
wenn du ein neues willst, das neben deinem exisitieren soll, dann musst du ein neues QWidget oder was du willst erstellen und es mit QLayout nebeneinander positionen .
gast23
Beiträge: 103
Registriert: 11. August 2010 10:43

Beitrag von gast23 »

Wir reden glaube ich aneinander vorbei.

Sry meine Schuld.

Also ich möchte ein Custom Control bauen das ich mit Layout und andern Widgets + Styling nicht hinbekomme.

Aus diesem Grund hab ich angefangen das Control in der Paint Methode zu zeichen. Nun möchte ich das ich auf einen Click an einer bestimmte Stelle reagieren kann.

Nun die Frage:

Wie und mit welchen Möglichkeiten könnte ich das realisieren?

Viele Grüße
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

1. Von QWidget ableiten
2. paintEvent überladen
3. mousePressEvent überladen
gast23
Beiträge: 103
Registriert: 11. August 2010 10:43

Beitrag von gast23 »

Muss ich dann sowas wie ein Hittest durchführen?
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Wenn du wissen willst, wo du getroffen hast, wäre das nicht schlecht...
gast23
Beiträge: 103
Registriert: 11. August 2010 10:43

Beitrag von gast23 »

Gibt es da Methoden die mir helfen?
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Code: Alles auswählen

if (x>10 && x<20 && y>10 && y<20) {
  qDebug() << "ganz alleine gefunden...";
}
Nvidia
Beiträge: 238
Registriert: 22. Februar 2010 21:23

Beitrag von Nvidia »

MousePressEvent -> globalX/Y oder x/Y
gast23
Beiträge: 103
Registriert: 11. August 2010 10:43

Beitrag von gast23 »

Es ist nicht irgendwie möglich in der Paint Methode einen Anker festzulegen?

Damit ich diesen direkt mit dem MousePressed Event abgleichen kann?
Nvidia
Beiträge: 238
Registriert: 22. Februar 2010 21:23

Beitrag von Nvidia »

nein, weil das was du draufmalst keine eigenstaendige objekte sind.
Antworten