Bereich "aktivieren" nach Mausklick
-
Hallo liebe C++ Community,
also folgendes, ich habe mit hilfe des QTPainters zwei Rechtecke gezeichnet. Jetz möchte ich wenn ich in diese Recktecke klicke diese "aktivieren". Also z.B. das die Fläche in den Rechtecken eine Farbe bekommen oder sonstige Aktionen durchführen. Hoffe jemand kann mir helfen.
Hier mein bisheriger Code
#include "button.h" #include <qlabel.h> #include <qpainter.h> #include <kmainwindow.h> #include <klocale.h> button::button() { } button::~button() { } void button::paintEvent (QPaintEvent*) { QPainter paint( this ); paint.setWindow( -2000, -1800, 3000, 2600 ); paint.setPen(QPen(Qt::black,2)); //Button1 paint.drawRect( 0, 0, 500, 750); //Button2 paint.drawRect( 0, -250, 500, -750); //paint.setBackgroundColor
-
Hi,
um dein Problem zu lösen musst du die Methode mousePressEvent(QMouseEvent *e)
überschreiben. Das würde dann ungefähr so aussehen.void CZeichenDlg::mousePressEvent(QMouseEvent * e) { e->accept(); mouseInside = false; switch(e->button) { case Qt::LeftButton: if(e->pos().x() > 0 && e->pos().x() < 500 e->pos().y() > 0 && e->pos().y() < 750) mouseInside = true; break; default: break; } } void button::paintEvent (QPaintEvent*) { QPainter paint( this ); paint.setWindow( -2000, -1800, 3000, 2600 ); if(mouseInside) paint.setPen(QPen(Qt::blue,2)); else paint.setPen(QPen(Qt::blue,2)); //Button1 paint.drawRect( 0, 0, 500, 750); ...
Besser wärs natürlich du erstellst eine Klasse Button welche die Varialbe inside enthält und speicherst die in einer Liste. Beim MousePressEvent gehst du dann die liste durch und guckst in welchem Rechteck sich die Maus befindet und setzt dann das inside auf true. Beim paintEvent gehst du dann wieder die list durch und mals dann das Rechteck blau bei dem die inside variable true ist.
-
Du müsstest der Klasse entsprechende Membervariablen geben, z.B. von QRect. Damit weis die Klasse immer wo ihre Rechtecke liegen.
Jetzt kannst du bei einem Klick prüfen, ob der dort drin liegt, und entsprechend die Farbe für das Rechteck ändern.
-
Super Dakeschön!
Könnt ihr mir noch bei den neuaufgekommenen Fehlern helfen?
button/src/button.cpp:39: error: ‘CZeichenDlg’ has not been declared button/src/button.cpp:42: error: ‘mouseInside’ was not declared in this scope button/src/button.cpp:43: error: switch quantity not an integer button/src/button.cpp:47: error: expected `)' before ‘e’
Edit: gut vergesst das obere, ich versuchs jetz mit dem QRec( danke phlox81).
Jetz habe ich dass geschrieben:
void button::mousePressEvent ( QMouseEvent * e ) { QRect r( 0, 0, 500, 750 ); e->x(), e->y(); // e->pos(); if ( r.contains ( e->x(), e->y()) ) { QPainter paint( this ); paint.fillRect ( 0, 0, 500, 750, yellow ); }
Nur leider ist ihm egal wo ich hinklicke, das ganze Fester wird gelb.
Warum nur??
mfg LPer
-
Ich nehme jetzt mal an:
QRect(x,y,height,width)Ist dein Fenster vielleicht zu klein?
Was passiert wenn du x,y werte so setzt, das sie nicht am Fensterrand liegen (z.b. 50,50)?phlox
-
Hi,
den von mir geposteten quelltext hättest du noch an dein projekt anpassen müssen. Deswegen kamen auch die fehler.
Die QRect Methode scheint mir auch passender da du ja mit Rechtecken malst.
Du musst das malen des rechtecks in der Methode paintEvent durchführen. Ich glaube dass deswegen die ganze oberfläche gelb wird.
void button::mousePressEvent ( QMouseEvent * e ) { QRect r( 0, 0, 500, 750 ); if(r.contains(e->x(),e->y())) isInside = true; // Diese Variable musst du in deiner Klasse deklarieren else isInside = false; update();//veranlasst das neuzeichnen der Oberfläche } void button::paintEvent(QPaintEvent *e) { e->accept(); QPainter painter(this); painter.fillRect(0,0,width(),height(),QBrush(Qt::white));// Füllt den Hintergrund if(isInside) painter.fillRect(0,0,500,750,QBrush(Qt::yellow); // Zeichnet gelbes rechteck else painter.fillRect(0,0,500,750,QBrush(Qt::blue); // Zeichnet normales rechteck }
-
Hallo Hoschek, danke dir
ich kann nur mit dem Fehler leider nichts anfangen, weiss jemand der Fehlermeldungs Lösung?
button.cpp:51: error: 'class QPaintEvent'; has no member named 'accept';
Edit: Hab nur das dazu gefunden, nur weiss ich leider nicht wie ich das in mein Projekt integriere.
void QMouseEvent::accept ()
Edit2: btw. ich verwende qt3 weiss nicht ob das einen Unterschied macht.
Ich habe es mal ohne dem e-accept(); versucht, dann funktioniert es mittelprächtig, wenn ich leicht ausserhalb des Dreiecks klicke wird es gelb und wenn ich (auch nur manchmal) ins Dreieck klicke wird es wieder blau.
-
Hi,
dass du Qt 3 benutzt wusste ich nicht. Die Klasse QPaintEvent besitzt in dieser Version die Methode accept() nicht.
Ich habe in der Methode mousePressEvent(QMouseEvent *e) noch vergessen, dass am anfang das e->accept() stehen muss. Vllt hat es deswegen nur manchmal geklappt.Sagtest du Dreieck? Ich dachte es sollten Rechtecke sein?
-
sorry, bin natürlich immer noch bei Rechtecken
das mit qt3 tut mir leid. Wie gesagt mache ich derzeit ohne e->accept() weiter. Das Problem ist nur das die Koordinaten vom Mausklick nicht mit denen des Rechtecks übereinstimmt. Also ich muss irgendwo ausserhalb des Rechteckes klicken damit es farbig wird.
Liegt das eben an meinem fehlenden e->accept() oder ist das ein anderes Problem (Window Koordinaten,..??).
-
Ahh wart mal das könnte gut sein. Ich weiß net wie das bei qt 3 ist aber vllt sind die koordinaten von e->pos() die globalen koordinaten...Nee doch net. Hab grad mal nachgeguckt. Die funktion e->x() liefert die x-Koordinate raltiv zum widgeht in dem die funktino aufgerufen wird. Wo hast du denn die funktion eingebaut. Ist die in dem widget drin wo auch gezeichnet wird? Erkläre doch mal genau wann das rechteck gelb wird und wann es sich blau verfärbt.