Seite 1 von 2
Anzeige in der Taskleiste
Verfasst: 18. April 2009 13:45
von TK
Tach Leute,
Ich hole mal aus:
Ich habe eine Klasse A, welche Widget erbt. Wird ein Objekt A instanziiert und mit show() angezeit, erscheint der WindowsTitle in der Taskleiste. Gut soweit. Jetzt klicke ich auf einen Button, welcher mir ein Objekt B von der Klasse B, die ebenfalls von Widget abgeleitet ist, instanziiert.
Mit A->Hide() und B->show() wird nun nur Objekt B angezeit. Doch in der Taskleiste ist ein unschöner Effekt zu sehen: Taskleisteneintrag von A verschwindet und Taskleisteneintrag von B "rutscht" von rechts nach links nach. Das sieht irgendwie doof aus.
Welche Codezeile, Flag oder wie auch immer bewirkt nun, dass der Taskleisteneintrag, ich sage mal, "fix stehenbleibt"? Das geht, ich weiß nur nicht wie. Habe das mim Borland Builder, vor zwei Jahren, hinbekommen, aber finde das verantwortliche Codeschnipsel nicht mehr
Danke LG TK
Verfasst: 18. April 2009 14:28
von TK
Also habe es nun mal mit dem Flag Qt::Tool probiert. Das Problem hierbei ist, dass zum einen das neue Fenster eine andere Menüleiste hat, und zum anderen, da ich durch A->hide() das erste Fenster verstecke, überhaupt kein Taskleisteneintrag merh da ist. Also, Qt::Tool ist nicht geeignet. Hm...
Verfasst: 18. April 2009 16:57
von Christian81
Ein QMainWindow benutzen und alle anderen Widgets/Dialoge als Parent davon - schon gibt es nur einen Taskleisteneintrag.
Verfasst: 18. April 2009 17:01
von TK
Oookay, probiere es mal aus.
Danke für den Tipp.
Verfasst: 18. April 2009 17:21
von TK
Ähm ja, ich glaube, komme da nicht weiter.
Habe nun ein QMainWindow erzeugt, in dessen Konstruktor ein Widget A instanziiert, dies als CentralWidget setze und mit show() anzeigen lasse. Adde noch einen Button dazu, mit dem ich über ein clicked()event ein Objekt B, einer von mir geschriebenen Klasse B inszanziiere (QWidget) und lasse diese mit show() anzeigen. Wie mache ich nun das Objekt B als parent von A? Gibts wo ein Beispiel in der Doku, wenn ja kurzes Schlagwort. THX!
Verfasst: 18. April 2009 17:28
von franzf
In dem du den assistant öffnest, Doku QWidget anzeigen lässt und in Richtung "set" scrollst, da findest du dann auch ein "setParent()"... So schwer?
Außerdem solltest du schauen, was Christian geschrieben hat:
Ein QMainWindow benutzen und alle anderen Widgets/Dialoge als Parent davon
Er meint natürlich, dein MainWindow soll parent deiner Widgets sein.
Aber vllt. interessiert dich ja auch mehr, einen QDialog zu öffnen an stelle eines QWidget? Hat sicher Vorteile...
Verfasst: 18. April 2009 19:08
von TK
Warning: It is very unlikely that you will ever need this function. If you have a widget that changes its content dynamically, it is far easier to use QStackedWidget.
Hm, ich glaube ich sollte eine andere Herangehensweise wählen. Vielleicht ist eine QDialog-Anwendung doch sinnvoller. Ist es aber möglich, ein Dialogfenster durch den Benutzer zu maximieren/minimieren, also ich meine, es fehlen ja dann die Min/Max Icons. Oder ein SDI?
Zumal das mit dem setParent() nicht funktionierte. Taskleisteneintag ist weg, sowie das Fenster ist verschwunden.
Code: Alles auswählen
void MainWindow::on_neuSSI_clicked(void)
{
OptionenSSI *A = new OptionenSSI();
if(this->isMaximized())
{
A->showMaximized();
}
else
{
A->move(this->pos());
A->resize(this->size());
}
A->setParent(widget);
widget->show();
A->show();
this->hide();
}
Verfasst: 18. April 2009 19:51
von franzf
Ich versteh deinen Eiertanz nicht.
Was ist widget? Warum machst du es nicht einfach mit
Damit auch wirklich das MainWindow das parent (parent = "Elter") ist.
Ich versteh auch nicht, warum du unbedingt das A komplett über das MainWindow legen MUSST, das schaut in vielen Fällen einfach dreckig aus, und mit einem Mauswink ist das Fenster verschoben und die ganze Rechnerei fürn deibel.
Nimm doch bitte einfach einen Dialog und zeig den Modal an, dann gibt es für den User keine Möglichkeit mehr, mit dem MainWindow zu interagieren, und das ist glaub ich auch der Hintergrund deiner Versuche.
Verfasst: 18. April 2009 20:01
von TK
Achso, logisch, das Widget im MainWindow ist ja gar nicht das MainWindow.
Jo, da hast du recht, die Rechnerei ist fürn Deibl, daher wollte ich einfach, wenn A wieder geschlossen wird, dessen neue Größe und Koordinaten wieder dem MainWindow übergeben. Oder ist das Eiertanz mit Spaghetticode obendrein ?
Das alles mim QDialog zu lösen gefällt mir nicht.
Verfasst: 18. April 2009 20:19
von franzf
Auch wenn du die QDialog-Lösung nicht schön findest, ist sie das in meinen Augen schon

Aber es gibt auch noch Alternativen. Z.B. im MainWindow das centralWidget austauschen? Einfach das aktuelle in in nem Klassenmember speichern, und dein neues Widget "A" als centralWidget setzen. Nach Belieben Toolbar/MenuBar ausblenden. Das ist auch gleich noch übersichtlicher und für den User verständlicher. (An den Armen Tropf vorm Rechner, der deine Software bedient musst du ja leider auch noch denken, und für den ist eine Dialog-Lösung sicher handlicher...)
Grüße
Franz
Verfasst: 18. April 2009 21:14
von TK
Hey Franz,
deine Alternativlösung klingt verlockend. Finde es gut, dass eine Diskussion über das WIE entsanden ist. Hintergurnd ist, und jetzt pass auf: ICH habe die ganze Applikation schon mal mim BorlandBuilder geschrieben. Will aber nun das Ganze mit Qt und in diesem Zuge auch eleganter realisieren. Jetzt denkst de vielleicht, der Kollege müsste mehr Programmiererfahrungen haben. Nun ja, ist halt en bissel länger her und bin nicht primär in dem Geschäft. Aber ich schaue deine Alternativlösung mir mal an, vorallem, ob ich auch damit klar komme. Schönen Abend noch.
LG TK
Verfasst: 19. April 2009 11:29
von TK
main.cpp
Code: Alles auswählen
#include <QtGui/QApplication>
#include "mainwindow.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
mainwindow.h
Code: Alles auswählen
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QtGui/QMainWindow>
#include <A.h>
#include <Auswahl.h>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
~MainWindow();
A *myA;
Auswahl * myAuswahl;
};
#endif // MAINWINDOW_H
mainwindow.cpp
Code: Alles auswählen
#include "mainwindow.h"
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
{
myA = new A();
myAuswahl = new Auswahl();
setCentralWidget(myAuswahl);
}
MainWindow::~MainWindow()
{
}
auswahl.h
Code: Alles auswählen
#ifndef AUSWAHL_H
#define AUSWAHL_H
#include <QWidget>
#include <QPushButton>
#include <QVBoxLayout>
#include <QLabel>
class Auswahl : public QWidget
{
Q_OBJECT
public:
Auswahl();
QPushButton *buttonAuswahlKlasseA;
QPushButton *buttonAuswahlBeenden;
QVBoxLayout * layoutAuswahl;
QLabel * labelInfoAuswahl;
};
#endif // AUSWAHL_H
auswahl.cpp
Code: Alles auswählen
#include "auswahl.h"
Auswahl::Auswahl()
{
buttonAuswahlKlasseA = new QPushButton(tr("Auswahl Klasse A"));
buttonAuswahlBeenden = new QPushButton(tr("Beenden"));
connect(buttonAuswahlBeenden, SIGNAL(clicked()), this, SLOT(close())); // Beendent Applikation
labelInfoAuswahl = new QLabel(tr("Auswahl Klasse"));
layoutAuswahl = new QVBoxLayout;
layoutAuswahl->addWidget(labelInfoAuswahl);
layoutAuswahl->addWidget(buttonAuswahlKlasseA);
layoutAuswahl->addWidget(buttonAuswahlBeenden);
setLayout(layoutAuswahl);
}
a.h
Code: Alles auswählen
#ifndef A_H
#define A_H
#include <QWidget>
#include <QPushButton>
#include <QVBoxLayout>
#include <QLabel>
class A : public QWidget
{
Q_OBJECT
public:
A();
QPushButton *buttonFertig;
QVBoxLayout * layoutA;
QLabel * labelInfoA;
};
#endif // A_H
a.cpp
Code: Alles auswählen
#include <QtGui>
#include "a.h"
A::A()
{
buttonFertig = new QPushButton(tr("fetrig"));
connect(buttonFertig, SIGNAL(clicked()), this, SLOT(close()));
labelInfoA = new QLabel(tr("Klasse A"));
layoutA = new QVBoxLayout;
layoutA->addWidget(labelInfoA);
layoutA->addWidget(buttonFertig);
setLayout(layoutA);
}
Hier ist mal der ganze Code. Jetzt habe ich dazu zwei Fragen:
1)
Wie kann ich nun, wenn ich auf den Button buttonAuswahlKlasseA von anwendung.cpp klicke, im mainwindow das Widget a anzeigen lassen? Wie sieht da die Verbindung über connect() aus?
2)
Durch klicken von buttonAuswahlBeenden in auswahl.cpp wird nur das Widget gschlossen. Ist mir auch klar, doch wie bewerkstellige ich es, dass die komplette Anwendung geschlossen wird? Geht das über ein WindowsFlag?
Schon mal Danke für hilfreiche Antworten auf die, für manche hier, gestellten noob-Fragen
LG TK
Verfasst: 20. April 2009 00:56
von 000Hunter000
zu 1.
Du musst einen neuen SLOT machen in dem du mit setCentralWidget(myA) das central widget auf myA setzt und dann das clicked signal vom Button zu diesen slot connecten. Wenn du jetzt z.B. den SLOT in deiner Auswahl klasse machst musst du auch einen Pointer zum mainWindow und myA an die Klasse übergeben und dann im slot aufrufen:
mainWindow->setCentralWidget(myA);
zu 2.
connect(buttonAuswahlBeenden, SIGNAL(clicked()), qApp, SLOT(quit()));
alternativ schau dir mal quitOnLastWindowClosed
Verfasst: 20. April 2009 16:06
von TK
Vielen Dank, Hunter!
Werde es ausprobieren!
zu 2.
connect(buttonAuswahlBeenden, SIGNAL(clicked()), qApp, SLOT(quit()));
Schreibe ich in die Auswahl.cpp Klasse die genannte Codezeile, ist qApp nicht deklariert. Somit ist qApp auch hier ein Pointer auf das MainWindow.?
LG TK
Verfasst: 20. April 2009 17:11
von franzf
qApp ~= QApplication::instance()
Lies nach in der Doku (assistant suchen nach qApp, so schwer?) warum "~=" und nicht "==".
Grüße
Franz