PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit dynamischen Widget



dml
18-08-2008, 11:12
Hi,
ich habe ein kleines Problem mit Qt.
Ich habe ein hauptwidget


HauptWidget::HauptWidget(){
ButtonBox oben;
QTreeWidget links
xxx rechts;
ButtonBox unten;
}

daraus ensteht dann grafisch ein Fenster


------------------
| oben |
------------------
| links | rechts |
-----------------
| unten |
------------------

Doch wie wie muss xxx beschaffen sein um dort immer
wieder ein neues Widget mit Inhalt anzeigen zu lassen
wenn ich in oben, links oder unten z.B. einen Knopf drücke?

locus vivendi
18-08-2008, 11:59
Doch wie wie muss xxx beschaffen sein um dort immer
wieder ein neues Widget mit Inhalt anzeigen zu lassen
wenn ich in oben, links oder unten z.B. einen Knopf drücke?
Ist dir nur entfallen das du einen Zeiger auf QWidget benutzen kannst, oder verstehe ich die Frage falsch? Ein Zeiger könnte jedenfalls "dynamisch" auf unterschiedliche konkrete Widgettypen zeigen.

undefined
18-08-2008, 12:02
Mehrerer weg führen nach Rom ;)
QDockWidget oder eine eigene Klasse von QVariant Template ableiten.
Wobei QDockWidget das sein dürfte was du suchst.
An sonsten kannst du casten in der Qt Doc "An Introduction to Model/View Programming" abschnitt "Delegates/QAbstractItemDelegate" kannst du sehen wie man es machen kann.

dml
18-08-2008, 12:30
erstmal vielen dank für eure Hilfe!!!
Das ist meine letzte Hürde bis ich das Programm online stellen kann.

QDockWidget hatte ich auch die idee, doch wie ich es verstanden habe wird es an ein anderes Widget angehängt, doch es soll an eine bestimmte Stelle in dem HauptWidget.

Stimmt da habe ich die Bezeichnung unüberlegt verwendet. doch ich find die idee super!

aus xxx rechts; wird:


HauptWidget::HauptWidget(){
QWidget *wid = new QWidget;
Cocktail cocktail;
Colorscheme farbscha;
}

void Hauptwidget::setright(){
wid=cocktail;
}

grundsätzlich oder? :)

undefined
18-08-2008, 13:13
erstmal vielen dank für eure Hilfe!!!
.........
QDockWidget hatte ich auch die idee, doch wie ich es verstanden habe wird es an ein anderes Widget angehängt, doch es soll an eine bestimmte Stelle in dem HauptWidget.
............

Das ist eine Layout frage siehe QGridLayout oder QHBoxLayout.

dml
18-08-2008, 13:55
cool ich bin durch mit QDockWidget!
Zickt zwar noch an ein paar Stellen, doch das ist ja normal.

vielen dank! :)

dml
19-08-2008, 13:37
zwei kleine fragen habe ich leider noch,

wenn ich zwei Verschiedene WidgetKlassen mit ->setWidget anzeige, bleibt die andere immer bestehen. Ich habe leider keine entsprechende Methode gefunden um zu pruefen ob schon ein Widget gesetzt wurde. Wisst Ihr wie man das sauber lößt?

Ich habe es geschafft mit NoDockWidgetFeatures die Funktionen zu deaktivieren, doch wie bekomme ich den Strich weg?

vielen dank! :)

undefined
19-08-2008, 20:51
Siehe findChild oder findChildren
Aber im Normalfall sind QStackedWidget dafür besser geeignet.


/* Check Boxen suchen */
foreach ( QCheckBox *cb, findChildren<QCheckBox *>() )
{
qDebug() << cb->objectName();
}

dml
18-04-2009, 12:21
Hi,

ich hab mal noch eine Frage dazu.

ich habe eine Klasse Recipe, in der habe ich noch eine Methode von QLineEdit
hinzugefügt.


Recipe{
QLineEdit erster;
QLineEdit zweiter;
QLabel text;
}



void QLineEdit::mousePressEvent(QMouseEvent *event){

}


doch wie komme ich nun von QLineEdit auf QLabel?




void QLineEdit::mousePressEvent(QMouseEvent *event){
text.setText();
}
QLabel nur sinngemäß für Zugriff auf Klasse von Recipe, ich brauche aber unbedingt mousePressEvent.





P.S.:
Nehmt ihr inzwischen eigentlich auch Geld? :D

anda_skoa
19-04-2009, 15:25
Entweder leitest du von QLineEdit ab und reimplementierst mousePressEvent() oder du benutzt einen Eventfilter.

Im ersten Falle kannst du deiner LineEdit Klasse alles übergeben was du brauchst, im zweiten Falle kann Recipe selbst der EventFilter sein.

Ableiten ist vom Prinzip her sauberer, bei Eventfiltern muss man ein bischen aufpassen, weil man da mitten in die Eventverarbeitung eingehängt wird.
Ist aber auch ein bischen mehr Codeaufwand.

Ciao,
_

dml
20-04-2009, 10:06
Na, ich bin zunächst über

void QLineEdit::mousePressEvent(QMouseEvent *event){
QLineEdit::parent()->parent()->parent()->parent()->recipe->category...
}
gegangen.
Nicht hübsch, aber einfach. Doch obwohl ich in MainWidget worin sich recipe->category befindet bin, sagt er mir QObject hat kein Element namens recipe.

QDebug() ->parent()=MainWidget(0x12345).


Aber ich werde es wohl über den EventFilter probieren müssen, obwohl ich es ein wenig überdimensioniert finde, da ich nur bei zwei LineEdits auf ButtonGroup zugreifen muss.

danke! ;)

anda_skoa
20-04-2009, 13:37
Na, ich bin zunächst über

void QLineEdit::mousePressEvent(QMouseEvent *event){
QLineEdit::parent()->parent()->parent()->parent()->recipe->category...
}
gegangen.


Du hast QLineEdit::mousePressEvent() reimplementiert? Im Sinne von Qt abgeändert?



Nicht hübsch, aber einfach. Doch obwohl ich in MainWidget worin sich recipe->category befindet bin, sagt er mir QObject hat kein Element namens recipe.

Hat es auch nicht. Siehe API Docs von QObject.
Vielleicht vergessen zu casten?



Aber ich werde es wohl über den EventFilter probieren müssen, obwohl ich es ein wenig überdimensioniert finde, da ich nur bei zwei LineEdits auf ButtonGroup zugreifen muss.


EventFilter ist da die einfachste mir bekannte Art.

Ciao,
_

dml
21-04-2009, 12:54
Hi,
ich habe es mit


bool Recipe::eventFilter(QObject *obj, QEvent *eve){
}

vesucht. Hat Funktioniert, doch weiß ich nicht wann ich einen bool zurück geben muss
oder QWidget::eventFilter(object,event)

dann habe ich es noch mit


void Recipe::mousePressEvent(QMouseEvent *event){
qDebug()<<"bla";
}

versucht, da ich über Hauptklasse von LineEdit und ButtonGroup, eigentlich drauf zugreifen können müsste.
Doch kommt einfach nicht an.

anda_skoa
21-04-2009, 15:49
Hi,
Hat Funktioniert, doch weiß ich nicht wann ich einen bool zurück geben muss


Die Doku sagt "if you want to filter the event out, i.e. stop it being handled further, return true; otherwise return false."
D.h. wenn du das Event nur sehen willst, aber nicht verhindern willst, dass es auch der LineEdit sieht, einfach false zurückgeben.





void Recipe::mousePressEvent(QMouseEvent *event){
qDebug()<<"bla";
}

versucht, da ich über Hauptklasse von LineEdit und ButtonGroup, eigentlich drauf zugreifen können müsste.
Doch kommt einfach nicht an.

Was heißt kommt nicht an?

Ciao,
Kevin