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
Frage zu QT: Programmierung (schwer)^^
-
- Beiträge: 386
- Registriert: 21. November 2007 20:07
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?
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?
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 ...
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 ...
Ne, ne Schleife brauchst Du nicht.
Einfach in Deiner GUI-Klasse diese virtuelle Funktion implementieren.
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
Einfach in Deiner GUI-Klasse diese virtuelle Funktion implementieren.
Code: Alles auswählen
void QWidget::mousePressEvent ( QMouseEvent * event )
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