Frage zu QT: Programmierung (schwer)^^

Alles rund um die Programmierung mit Qt
Antworten
QT4
Beiträge: 3
Registriert: 1. Juli 2008 19:19

Frage zu QT: Programmierung (schwer)^^

Beitrag von QT4 »

Hi,

ich bin gerade dabei etwas in QT zu programmieren. Hier meine Aufgabenstellung:

VERKEHRSAMPEL

Erzeugen Sie eine Anwendung mit einem QMainWindow als dessen Central-Widget.
Zeichnen Sie im Hauptfenster eine Verkehrsampel. Die Ampel soll in einem Fest vorgegebenen Intervall ändern können.
Sehen Sie zudem einen Menüpunkt vor, unterdem Sie das Zeitintervall ändern können. Mit einem Mausklickauf eine der Leuchtflächen der Ampel soll die Ampel auf die Entsprechende Farbe umschalten.
Zeigen Sie die Ampelphasen in der Statusleiste an.


Hier habe ich schonmal Kreise Gezeichnet und eingefärbt:

void ChrIse::paintEvent(QPaintEvent* event) {
QPainter painter(this);
QBrush R (Qt::red);
QBrush Y (Qt::yellow);
QBrush G (Qt::green);

painter.setBrush(R);
painter.drawEllipse(240,80,80,80);

painter.setBrush(Y);
painter.drawEllipse(240,180,80,80);

painter.setBrush(G);
painter.drawEllipse(240,280,80,80);

}


Wie kann ich nun auf die einzelnen Kreise zugreifen? Ich will wenn ich auf einen Kreis klicke das er die jeweilige Farbe annimmt. Vorher sollte er weiss sein. Ausserdem sollen die Kreise noch in Zeitlichen intervallen ablaufen können wenn man dieses so einstellt.

Vielen Dank für eure Hilfe

QT4
PeterLustig
Beiträge: 386
Registriert: 21. November 2007 20:07

Beitrag von PeterLustig »

MousePress(click?)Event neu implementieren, damit kannst du den Mausklick empfangen. Dann eben die Koordinaten überprüfen und entsprechend reagieren.
QT4
Beiträge: 3
Registriert: 1. Juli 2008 19:19

Beitrag von QT4 »

Neu implementieren?

Also mit Koordinaten meinst du die, mit denen ich die Kreise gezeichnet habe oder? Also wenn nur 1 Kreis farbig sein soll am anfang, und man dann auf einen anderen klickt soll der der vorher farbig war nun grau oder weiss werden. dazu braucht man ne schleife mit nem mouseklick event oder?
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

Also um "Zeichnungen" in nem Widget nachtraeglich zu aendern, musst du dir die informationen schon zwischenspeichern ...

sprich du haengst noch paar variablen an dein widget, die bestimmen wie genau die kreisse gezeichnet werden.
Im paintEvent deines Widgets malst dann die kreise entsprechend deiner variablen ....

nun faengst das mouseclick ab, und aenderst die variablen entsprechend, wie du nun die aenderung haben willst, und veranlasst das neuzeichnen des widgets bzw den entsprechenden teil.

wie gesagt, malen im
void QWidget::paintEvent ( QPaintEvent * event );
Neuzeichenen veranlassen mit
void QWidget::update ();
oder
void QWidget::repaint ();

schau dir die dokus dazu an ...

Es gibt noch nen anderen weg, der sich besonders eigenet wenn man rechteckige Bereiche hat.

du machst aus jedem kreis nen eigenes widget, was nur einen kreis malt ... und setzt dann die widgets zu der ampel zusammen, mittels layout.
Macht oftmals weniger arbeit, und man kann die events(mouseklick) intuitiver am Widget abfangen ....

wie gesagt, eignet sich aber ned immer, und besonders wenn man viele objecte hat, geht die performance dann schnell in die knie, wenn jedes dieser objecte ne eigene eventloop bekommt . Aber auch das kann man teilweisse entschaerfen (eventfilter etc)

Ciao ...
Sephral
Beiträge: 201
Registriert: 1. Februar 2006 09:40
Kontaktdaten:

Beitrag von Sephral »

Ne, ne Schleife brauchst Du nicht.
Einfach in Deiner GUI-Klasse diese virtuelle Funktion implementieren.

Code: Alles auswählen

void QWidget::mousePressEvent ( QMouseEvent * event )  
Dann bekommst Du ein Event, sobald jemand klickt.

Dann musst du ermitteln ob die Klick-Koordinate in einem Deiner Kreise liegt, wenn ja musst du die Kreise mit den passenden Farben neu zeichnen.


Ciao,
Sephral
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Event. wäre die QGraphicsView & Co. hier besser geeignet...
Sephral
Beiträge: 201
Registriert: 1. Februar 2006 09:40
Kontaktdaten:

Beitrag von Sephral »

Dachte ich mir auch, aber ich denke die Aufgabenstellung steht seitens des Profs / Tutors / Lehrers / Aufgabengebers nicht zur Diskussion.
QT4
Beiträge: 3
Registriert: 1. Juli 2008 19:19

Beitrag von QT4 »

Ja Okay Vielen Dank für Eure Hilfe!

Ich werds mal versuchen. Bin mir halt noch nicht so sicher mit dem ganzen kram da ich erst vor ein paar tagen mit QT und c++ begonnen habe^^

MfG QT4
Antworten