Seite 1 von 1

Frage zu QT: Programmierung (schwer)^^

Verfasst: 1. Juli 2008 21:05
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

Verfasst: 1. Juli 2008 21:14
von PeterLustig
MousePress(click?)Event neu implementieren, damit kannst du den Mausklick empfangen. Dann eben die Koordinaten überprüfen und entsprechend reagieren.

Verfasst: 2. Juli 2008 08:52
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?

Verfasst: 2. Juli 2008 10:02
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 ...

Verfasst: 2. Juli 2008 10:04
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

Verfasst: 2. Juli 2008 12:23
von upsala
Event. wäre die QGraphicsView & Co. hier besser geeignet...

Verfasst: 2. Juli 2008 12:27
von Sephral
Dachte ich mir auch, aber ich denke die Aufgabenstellung steht seitens des Profs / Tutors / Lehrers / Aufgabengebers nicht zur Diskussion.

Verfasst: 2. Juli 2008 21:15
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