EventHandler von QLabel Array

Alles rund um die Programmierung mit Qt
daniel_sudy
Beiträge: 16
Registriert: 5. März 2012 21:29

EventHandler von QLabel Array

Beitrag von daniel_sudy »

Hallo, ich habe folgendes Problem:
Ich habe eine Klasse QCondition die sich von QLabel ableitet. In dieser abgeleiteten Klasse habe ich einen mousePressEvent implementiert. Also wenn man mit der linken Maustaste auf das Label klickt, kommt ein Auswahlmenü in dem man z.B den Namen des Label setzen kann-> in späterer folge sollen hier Methoden aufgerufen werden in denen Informationen zu bestimmte eigenschaften gespeichert werden sollen.

Weiters habe ich eine Klasse showBits abgeleitet von QWidget! In dieser Klasse habe ich ein Array von meinem eigenen QLabel(QCondition) erstellt:

Code: Alles auswählen

for(int j=32;j>=0;--j)
		{
			bit01[i][j]= new QCondition(gui_);
			bit01[i][j]->setTextInteractionFlags(Qt::TextSelectableByMouse);
			bit01[i][j]->setFixedWidth(8);
			bit01[i][j]->setAlignment(Qt::AlignJustify);
			grid[i]->addWidget(bit01[i][j],i,count+1);
			count++;
			
		}
und diese Elemente einem QGridLayout zugewiesen. Nun kann ich auf einzelne Labels(QCondition) klicken und eben über dieses Auswahlmenü(eben über den mousePressEvent) Aktionen durchführen. Nun möchte ich aber mit der Maus mehere Labels markieren(Also mehere Elemente von diesem QLabel-Array) und für die markierten Elemente eine Auswahl aus dem mousePressEvent treffen, und dieses für alle markierten Elemente ausführen. Ich wäre dankbar übern einen kleinen Gedankenanstoß, wie ich dies realisieren könnte!

mfg Daniel
MiSi
Beiträge: 15
Registriert: 13. Februar 2012 11:17

Re: EventHandler von QLabel Array

Beitrag von MiSi »

Hallo,

warum schreibst du in dein OnClick nicht noch einen Abfrage ob mehrere markiert sind feuerst dann für alle Labels die Methode, die im Menu ausgewählt wurde mit Parameter?
Wäre es dazu nicht geschickter anstatt der Arrays QMap oder QDict zu benutzen?

Gruß
daniel_sudy
Beiträge: 16
Registriert: 5. März 2012 21:29

Re: EventHandler von QLabel Array

Beitrag von daniel_sudy »

Hallo, Danke für die Rückmeldung.
Ja das mit der Abfrage war auch mein erster Gedanke, abzufragen ob mehrere Lables makiert sind. Leider bin ich daraus nicht schlau geworden, habe nirgendwo ein Beispiel oder etc. gefunden, auch Google hat
mir nichts verraten! Wäre Dankbar wenn du mir vl kurz zeigen könntest, wie man in der OnClick Methode prüft, ob mehere Labels markiert sind.
Hier die OnClick Methode in meiner QCondition(QLabel Ableitung) Klasse:

Code: Alles auswählen

void QCondition::mousePressEvent(QMouseEvent *event)
{
    if(event->button()==Qt::RightButton)
    {
        menu->exec(event->globalPos());

    }
}
Werde mir nun auch mal QMap und QDict ansehen!
Lg
MiSi
Beiträge: 15
Registriert: 13. Februar 2012 11:17

Re: EventHandler von QLabel Array

Beitrag von MiSi »

Hallo,

im Grunde ist das Prüfen auf Markierung doch recht simpel. Du hast ja schon eine neue Label Klasse von QLabel abgeleitet.
Nun fügst du hier eine Private Variable bool hinzu und schreibst dazu die getter und setter methoden.

Im onClick des Labels prüfst du dann auf Linksklick und setzt (mit setter) dann jeweils die Variable auf True/False.

Wenn dann der Rechtsklick aufs Label kommt, musst du dein Array oder QMap oder QDict durchlaufen und prüfen

if getter()
{

}

und dann deine Methode, die du ausgewählt hast aufrufen.
daniel_sudy
Beiträge: 16
Registriert: 5. März 2012 21:29

Re: EventHandler von QLabel Array

Beitrag von daniel_sudy »

Danke, ja mit der boolschen Variable hab ich mir auch gedacht, aber ich versteh dann folgendes nicht:
Ich habe in meiner abgeleiteten Klasse QLabel den EventHandler umgeschrieben, eben das er für dieses Label den Linksklick durchführtn und ein Menü aufruft!
Das Array von dieser Klasse hab ich aber in einer anderen Klasse erzeugt die von QWidget abgeleitet ist. Sprich ich habe in der QWidget Klasse ein Array von meinem eigenen QLabel. Um nun mehrere Arrays zu markieren, sollt ich ja dann nicht den EventHandler in der QWidget Klasse umschreiben oder? Weil sonst kann ich ja keine Objekte meines
Arrays von meiner Klasse markieren. Das ist mein Hauptroblem. Habe ich dann diese Arrays markiert ist es mir schon klar das ich einfach dann die Boolsche Variable z.B isSelected von jedem Array Element setze.
Ich weiß z.B. jetzt eben auch nicht, wie ich ein Mausgitter erstelle, mit dem ich dann die Objekte markieren kann.
Wenn du mir hierbei etwas weiter helfen könntest, wäre ich sehr dankbar.
Lg Daniel
MiSi
Beiträge: 15
Registriert: 13. Februar 2012 11:17

Re: EventHandler von QLabel Array

Beitrag von MiSi »

Ok, nur damit ich das richtig verstehe. DU hast ein QWidget, auf dem die ganzen Labels liegen.
WEnn du nun auf ein Label einen links Klick machst öffnet sich das AUswahlmenu per Popup menu und du kannst verschiedene Methoden auswählen.

Bei der Markierung musst du halt einen Tod sterben. Entweder legst du den Markierungsklick auf die linke oder auf die rechte Maustaste oder denkst dir einen anderen Weg zur Markierung aus.
Danach stehst du vor folgendem PRoblem. Deine Labels kennen sich ja untereinander nicht und so kannst du im onClick des einzelnen Labels nicht die anderen LAbels ansprechen.
Nun gibt es zwei Wege, die du gehen kannst.

a) du machst deine Labels untereinander bekannt und gibst deiner Labelklasse den Pointer mit deinem Labelarray mit. (Das würde ich nicht empfehlen)
b) du gehst über die Childs von deinem QWidget. Das heißt im Label Click kannst du das Makro Q_CHILD verwenden.

Code: Alles auswählen

QLabel *pMyTempLabel = Q_CHILD(this->parent(),QLabel,LabelName) 
Da du ja weisst wieviele Label auf deinem QWidget liegen kannst du also in einer Schleife ueber all deine QLabels gehen und die dann auf Selected pruefen und dann den dazugehoerigen COde ausfuehren.
daniel_sudy
Beiträge: 16
Registriert: 5. März 2012 21:29

Re: EventHandler von QLabel Array

Beitrag von daniel_sudy »

Ja genau das ist mein Problem. Wo würde ich jetzt das markieren hin geben, in den EventHandler der Klasse QLabel oder eher in den EventHandler meines Widgets in dem die Labels sich befinden.
Das mit dem Q_CHILD hört sich interessant an, muss mir das mal genauer anschauen, bin ein ziemlicher Neuling in Qt und kenne die meisten nützlichen Operationen noch nicht wirklich.
Was gibt mir die Operation Q_CHILD zurück? Ich definiere also im der Klasse QCondition(Ableitung QLabel) dieses TempLabel. Würde dann nicht der Paraent des Labels das QWidget sein, in dem sich die Labels befinden?
Lg
MiSi
Beiträge: 15
Registriert: 13. Februar 2012 11:17

Re: EventHandler von QLabel Array

Beitrag von MiSi »

Also ich bin mit QT auch erst seit nem Monat in Kontakt vorher habe ich Delphi nutzen müssen.
Das Markieren würde ich in deine Condition schreiben. Da es ja auch logischer den WErt im Objekt zu speichern, dass gerade angeklickt wurde.

Q_CHILD gibt dir ein Objekt zurück mit dem es in den Parametern definiert wurde. In meinem COdebeispiel steht QLabel als 2. Parameter von Q_CHILD.

Da du über die Children von deinem Widget gehen willst ist der Parent des Labels also genau der richtige Ort zur Suche, da das QWidget ja die QLabels beinhaltet.

Wenn du dann im OnClick des Labels über die Children des QWidget läufts, dann bekommst du ja mit Q_CHILD das jewilige Label (wo der Labelname passt) als Object zurück.
Nun kannst du also mit deinem Object(pMyTempLabel->setText("hier steht dein Text");) den Text on the Fly fuer das markierte Label setzen.
Du musst halt immer vorher pruefen ob das Label selectiert ist und rufst dann deine Methode auf, die du in dem Menu ausgewaehlt hast.

Ich hoffe das war nun verstaendlich geschrieben :)

edit:
Natuerlich laeufst du dann auch, wenn du das nicht abfaengst, 2x ueber dein Ausgangslabel. Du musst also pruefen ob das Child dein jetziges LAbel ist, denn wenn das der Fall ist, dann sollte nichts geschehen.
daniel_sudy
Beiträge: 16
Registriert: 5. März 2012 21:29

Re: EventHandler von QLabel Array

Beitrag von daniel_sudy »

Danke für die Rückmeldung! Ich werde dies nun mal versuchen in mein Projekt zu implementieren, dann werde ich sehen ob ich es zur Gänze verstanden habe, oder ob doch noch Fragen auftauchen. Ansonsten hoffe ich, dass ich hier nochmal um Hilfe bitten kann. :D
Also nochmal rechtherzlichen Dank für die bisherigen Informationen!
Lg Daniel
daniel_sudy
Beiträge: 16
Registriert: 5. März 2012 21:29

Re: EventHandler von QLabel Array

Beitrag von daniel_sudy »

Hallo,
eine Frage hätte ich da noch! Ich beabsichtige ja mehrere Labels zu markieren, und da wäre es naheliegend gleich wie bei Windows mit gedrückter Maustaste
ein Fenster auf zu ziehen, sprich das Fenster über meine Labes zu ziehen, die ich auswählen will.
Gibt es da in Qt bei den MouseEvents eine Option, die so ein "Markierungsfenster" anzeigt??
Lg
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: EventHandler von QLabel Array

Beitrag von franzf »

Gibt es nicht, musst du selber machen - nennt sich QRubberBand - in der Doku steht eigentlich alles wissenswerte dazu.
daniel_sudy
Beiträge: 16
Registriert: 5. März 2012 21:29

Re: EventHandler von QLabel Array

Beitrag von daniel_sudy »

Danke, dass ist genau das, was ich gesucht habe!
Lg
daniel_sudy
Beiträge: 16
Registriert: 5. März 2012 21:29

Re: EventHandler von QLabel Array

Beitrag von daniel_sudy »

Hallo MiSi,
ich hätte da noch eine Frage zu der Q_CHILD Funktion, das ist mir noch nicht ganz klar. Ich versuchs jetzt hier mitn einem kleinen Bsp. zu veranschaulichen, wie ich es versuche:
Also zuerst mal meine QCondition Klasse:

Code: Alles auswählen

#include "qcondition.h"
#include <QAction>
#include <QtGui>
#include <QAction>
#include "guinltool.h"



QCondition::QCondition(GUINlTool *gui, QWidget *parent):QLabel(parent)
{
}
void QCondition::mousePressEvent(QMouseEvent *event)
{
    if(event->button()==Qt::RightButton)
    {
        menu->exec(event->globalPos());
[b]Hier sollte nun der Code mit Q_CHILD rein[/b]
QLabel *temp = Q_CHILD(this->parent(),QLabel,"bit01");
Wäre dies hier so richtig? Compiler sagt Q_CHILD kennt er nicht! 

    }
}
Nun meine AnzeigeKlasse von QWidget

Code: Alles auswählen

showBits::showBits(GUINlTool *gui, QWidget *parent):QWidget(parent)
{
	gui_=gui;
	//mainStep= new QLabel;
	//vbox = new QVBoxLayout;
	//vbox->addWidget(mainStep);
	allBox = new QVBoxLayout;
	QFont myFont;
	myFont.setBold(true);

for(int i=0;i<7;++i)
{
for(int j=32;j>=0;--j)
		{
			bit01[i][j]= new QCondition(gui_);
			bit01[i][j]->setTextInteractionFlags(Qt::TextSelectableByMouse);
			bit01[i][j]->setFixedWidth(8);
			bit01[i][j]->setAlignment(Qt::AlignJustify);
			grid[i]->addWidget(bit01[i][j],i,count+1);
			count++;
			
		}
}
Wäre es möglich, mir anhand meines Codes zu zeigen, wie ich nun alle QCondition(QLabels) ansprechen kann?
LG
MiSi
Beiträge: 15
Registriert: 13. Februar 2012 11:17

Re: EventHandler von QLabel Array

Beitrag von MiSi »

Code: Alles auswählen


void QCondition::mousePressEvent(QMouseEvent *event)
{
    if(event->button()==Qt::RightButton)
    {
        menu->exec(event->globalPos());
       //hier eine For schleife ueber alle QConditions auf der Maske. Die Anzahl musst du wissen.
       for (i=0;i==12;i++)
        {
           //Hier den QConditionnamen fuer alle Label anpassen, sodass du alle Labels ansprechen kannst. 
           // bit01,bit02,bit03  , wobei ich die 0 weglassen wuede bei den namen, da machst du dir nur arbeit.
           //Also ein QString, der den QConditionname  beinhaltet hier hin und dann unten bei QCHild als 3. Parameter.
           QCondition *temp = Q_CHILD(this->parent(),QCondition,"bit01");
           if(Q_CHILD(this->parent(),QCondition,"bit01") != 0)//Wenn das Objekt gefunden wurde....
           {
                if(this->name() != temp->name()) // damit du nicht ueber das gleiche Label 2x laeufst. Weil du ja ueber alle Labels gehst wirst du zwangslaeufig auch ueber das AUsgangslabel laufen.
                {
                     if(temp->getSelected())
                     {
                         // hier dein Code, den du dem Label beibringen willst.
                     }
                }
           }
     }
    }
}


Falls er Q_Child nicht findet musst du mal deine Includes checken. Ich musste dazu eigentlich nichts includen.
daniel_sudy
Beiträge: 16
Registriert: 5. März 2012 21:29

Re: EventHandler von QLabel Array

Beitrag von daniel_sudy »

Was meinst du genau den Namen meiner QConditions anpassen? Die heißen doch alle bit01 nur halt dann entsprechend der schleife bit01[0][1]---bit01[9][32], da versteh ich jetzt nicht genau was du meinst!
Antworten