Generelle Frage![gelöst]
Generelle Frage![gelöst]
Hi,
also ich habe Folgende Dinge schon vorhanden und Funktionsfähig:
- Ein MainWindow
- In dem MainWindow ist immer Ein Widget.
- Eine Command Zeile in der ich z.B. Befehle eingeben kann
- Auf bestimmte Befehle werden Andere Widgets in dem Vorhandenen Widget erstellt z.B. "quad" erstelle ich 4 Widgets die alle gleich groß sind.
-Ich kann ein Bild in das kleinere Widget laden.
So zum Verständniss.
Ich habe Eine MainWindow Klasse, eine Klasse für die "kleinen" Widgets und das große Widget was immer Vorhanden ist ist mit dem Designer erstellt.
Mein Problem bzw. Generelle Frage ist jetzt:
Das wenn ich ein Bild lade das das Bild dann in allen 4 (bei quad) Widgets zu sehn ist. Ich möchte aber nur das es in einem der Widgets zu sehn ist. Und die anderen etwas anderes zeigen.
Also meine Frage wie ich das am Besten umsetzen könnte?
Gruß
Qt-nator
also ich habe Folgende Dinge schon vorhanden und Funktionsfähig:
- Ein MainWindow
- In dem MainWindow ist immer Ein Widget.
- Eine Command Zeile in der ich z.B. Befehle eingeben kann
- Auf bestimmte Befehle werden Andere Widgets in dem Vorhandenen Widget erstellt z.B. "quad" erstelle ich 4 Widgets die alle gleich groß sind.
-Ich kann ein Bild in das kleinere Widget laden.
So zum Verständniss.
Ich habe Eine MainWindow Klasse, eine Klasse für die "kleinen" Widgets und das große Widget was immer Vorhanden ist ist mit dem Designer erstellt.
Mein Problem bzw. Generelle Frage ist jetzt:
Das wenn ich ein Bild lade das das Bild dann in allen 4 (bei quad) Widgets zu sehn ist. Ich möchte aber nur das es in einem der Widgets zu sehn ist. Und die anderen etwas anderes zeigen.
Also meine Frage wie ich das am Besten umsetzen könnte?
Gruß
Qt-nator
Zuletzt geändert von Qt-nator am 28. Mai 2008 09:22, insgesamt 1-mal geändert.
-
PeterLustig
- Beiträge: 386
- Registriert: 21. November 2007 20:07
Ich post mal bisschen Code vieleicht versteht mans dann besser.
Konstruktor vom großen Widget
Hier lade ich das Bild:
Das die Klasse von den "kleinen Widgets"
Ja und wenn ich dann eins Lade sind alle Voll...
Konstruktor vom großen Widget
Code: Alles auswählen
m_pPlot1 = createWidgets(0,0,width()/2. - 1,height()/2. );
m_pPlot2 = createWidgets(width()/2. + 1,0,width()/2., height()/2.);
m_pPlot3 = createWidgets(0,height()/2. + 1,width()/2. -1 , height()/2.);
m_pPlot4 = createWidgets(width()/2. + 1,height()/2. + 1,width()/2.,height()/2.);
m_pPlot1->setTag("Plot1");
m_pPlot2->setTag("Plot2");
m_pPlot3->setTag("Plot3");
m_pPlot4->setTag("Plot4");
//Funktion
ParameterToolPlot*
ParameterToolWidget::createWidgets(double dXCordinate,double dYCordinate, double m_dWidth, double m_dHeight)
{
ParameterToolPlot *pPlot = new ParameterToolPlot(this);
pPlot->setGeometry(dXCordinate, dYCordinate, m_dWidth, m_dHeight);
pPlot->setBackgroundRole(QPalette::Base);
pPlot->setAutoFillBackground(true);
QPalette Palette(pPlot->palette());
Palette.setColor(QPalette::Base, Qt::black);
pPlot->setPalette(Palette);
pPlot->show();
return pPlot;
}
Das die Klasse von den "kleinen Widgets"
Code: Alles auswählen
void
ParameterToolPlot::drawPicture(const QImage imgPicture)
{
QPainter painter(this);
painter.drawImage(0,0,imgPicture);
}
void
ParameterToolPlot::paintEvent(QPaintEvent * /* event */)
{
QPainter painter(this);
painter.setPen(QColor(255, 255, 255));
painter.setBrush(m_brush);
painter.setRenderHint(QPainter::Antialiasing, true);
painter.drawPoints(m_PolygonOfMousePositionPoints);
m_strTextTemp = "Radi2";
if (m_strTextTemp.contains("Radi2", Qt::CaseInsensitive))
{
drawPicture(PolarPlot::imgResult);
}
-
PeterLustig
- Beiträge: 386
- Registriert: 21. November 2007 20:07
Ich mach das mit Koordinaten weil die Größe des Widgets von der Größe des Gesamten Fensters abhängt und sich dynamisch verändern soll.
Und du meinst jetzt ich soll zu den "kleinen Widgets" ein QLabel hinzufügen.
Die kann ich dann einzelln befüllen? Das kann ich mir schwer vorstellen zumal das doch dann auch mit dem Widget selber gehen müsste?
Oder nicht? mein Bild krieg ich ja nur will ich es für jedes Widget einzelln laden können.
Und du meinst jetzt ich soll zu den "kleinen Widgets" ein QLabel hinzufügen.
Die kann ich dann einzelln befüllen? Das kann ich mir schwer vorstellen zumal das doch dann auch mit dem Widget selber gehen müsste?
Oder nicht? mein Bild krieg ich ja nur will ich es für jedes Widget einzelln laden können.
Zuletzt geändert von Qt-nator am 26. Mai 2008 15:14, insgesamt 1-mal geändert.
-
PeterLustig
- Beiträge: 386
- Registriert: 21. November 2007 20:07
Hast du überhaupt mal das Qt Tutorial durchgearbeitet? Genau dafür sind Layouts da, um die Widgets dynamisch an die Fenstergröße anzupassen!Qt-nator hat geschrieben:Ich mach das mit Koordinaten weil die Größe des Widgets von der Größe des Gesamten Fensters abhängt und sich dynamisch verändern soll.
Ein QLabel dient dazu ein Bild oder Text anzuzeigen, also genau das was du willst. Du bräuchtest deine QWidgets nicht einmal, wenn du nur ein Bild anzeigen willst. Einfach statt QWidget ein QLabel in das Layout (!) hinzufügen, und diesem QLabel das Bild zuweisen (setPixmap).Qt-nator hat geschrieben:Und du meinst jetzt ich soll zu den "kleinen Widgets" ein QLabel hinzufügen.
Die kann ich dann einzelln befüllen??? Das kann ich mir schwer vorstellen zumal das doch dann auch mit dem Widget selber gehen müsste???
Übrigens genügt ein Satzzeichen pro Satz... Zuviele Satzzeichen machen die Sätze nicht wichtiger, sie machen die Sätze penetrant und verleiten zum ignorieren.
Das für das Layout umzuschreiben ist mir jetzt zu umständlich da es ja auch ohne funktioniert bleibt das so.
Ok das klingt doch schonmal nicht schlecht. Also mal schaun ob ich das richtig verstanden habe.
Ich könnte in dem "großem" Widget 4 Labels erstellen und denen dann Bilder zuweisen. Und wenn die in einem Layout sind verändern diese sich auch dynamisch mit der Programmfenster größe.
Richtig?
Und so wie ich das bis jetzt habe ist das nicht mit Widgets umsetzbar?
Ok das klingt doch schonmal nicht schlecht. Also mal schaun ob ich das richtig verstanden habe.
Ich könnte in dem "großem" Widget 4 Labels erstellen und denen dann Bilder zuweisen. Und wenn die in einem Layout sind verändern diese sich auch dynamisch mit der Programmfenster größe.
Richtig?
Und so wie ich das bis jetzt habe ist das nicht mit Widgets umsetzbar?
-
dontinelli
- Beiträge: 146
- Registriert: 22. September 2006 20:53
Schon klar, dass du in allen Widgets das Bild hast, wenn du es in deiner Klassendeklaration einfügst!
Setz es doch einfach beim Erstellen der einzelnen kleinen Widgets (und nicht beim paintEvent) oder benutze wie Peter vorgeschlagen hat ein QLabel, dann hat sich das Problem gelöst.
PS Da bin ich wohl einen klick zu spät gewesen...
Setz es doch einfach beim Erstellen der einzelnen kleinen Widgets (und nicht beim paintEvent) oder benutze wie Peter vorgeschlagen hat ein QLabel, dann hat sich das Problem gelöst.
PS Da bin ich wohl einen klick zu spät gewesen...
Zuletzt geändert von dontinelli am 26. Mai 2008 17:18, insgesamt 1-mal geändert.
-
PeterLustig
- Beiträge: 386
- Registriert: 21. November 2007 20:07
Gut das ich das schonmal verstanden habe.
@ dontinelli:
Du meinst das ich hier schon das Bild setze?
Aber dann bekommen doch wieder alle das selbe Bild?
@ dontinelli:
Du meinst das ich hier schon das Bild setze?
Code: Alles auswählen
ParameterToolPlot*
ParameterToolWidget::createWidgets(double dXCordinate,double dYCordinate, double m_dWidth, double m_dHeight)
{
ParameterToolPlot *pPlot = new ParameterToolPlot(this);
pPlot->setGeometry(dXCordinate, dYCordinate, m_dWidth, m_dHeight);
pPlot->setBackgroundRole(QPalette::Base);
pPlot->setAutoFillBackground(true);
QPalette Palette(pPlot->palette());
Palette.setColor(QPalette::Base, Qt::black);
pPlot->setPalette(Palette);
pPlot->show();
return pPlot;
}
-
PeterLustig
- Beiträge: 386
- Registriert: 21. November 2007 20:07
-
dontinelli
- Beiträge: 146
- Registriert: 22. September 2006 20:53
In der paintEvent-Funktion setzt du das Bild. Und diese wird für jedes Widget aufgerufen. Die Doku hilft wie (fast) immer weiter.
Verschiebe den entsprechenden Code doch einfach an den Ort, wo du die entsprechenden Widgets generierst und rufe ihn nur für ein Widget (oder QLabel) auf.
Verschiebe den entsprechenden Code doch einfach an den Ort, wo du die entsprechenden Widgets generierst und rufe ihn nur für ein Widget (oder QLabel) auf.
Du meinst also ich soll
Hierhin verschieben?
Dann krieg ich dauerhaft ein Komplett schwarzes Wiget. Was irgendwie am Hintergrund liegen muss den ich auf schwarz gesetzt habe. Aber bei einem repaint läd er ganz schön lange also müsste sich da schon was tun nur seh ichs noch nicht.
Code: Alles auswählen
drawPicture(PolarPlot::imgResult);
Code: Alles auswählen
ParameterToolPlot*
ParameterToolWidget::createWidgets(double dXCordinate,double dYCordinate, double m_dWidth, double m_dHeight)
{
ParameterToolPlot *pPlot = new ParameterToolPlot(this);
pPlot->setGeometry(dXCordinate, dYCordinate, m_dWidth, m_dHeight);
pPlot->setBackgroundRole(QPalette::Base);
pPlot->setAutoFillBackground(true);
pPlot->drawPicture(PolarPlot::imgResult);
QPalette Palette(pPlot->palette());
Palette.setColor(QPalette::Base, Qt::black);
pPlot->setPalette(Palette);
pPlot->show();
return pPlot;
}
-
dontinelli
- Beiträge: 146
- Registriert: 22. September 2006 20:53
vor allem solltes du die doku mal lesen. schon klar siehst du schwarz, wenn du alles schwarz übermalst. und nein, ich würde den aufruf nicht in diese funktion, sondern in die übergeordnete, wo du diese aufrufst, packen. und nur für das widget, welches denn auch das bild enthalten soll. denn was du machst ändert gar nichts! wie soll man dir helfen, wenn du selber die übersicht über deinen code nicht hast...
Dann meinst du ich sollte es hier einfügen:
Und für jedes Widget ein anders Bild halt je nach dem was ich brauche.
Aber das mit dem schwarz versteh ich noch nicht. Ich setze doch nur den Hintergrund auf schwarz. Und das PaintEvent malt doch auch einfach drüber?
Warum geht das dann hier nicht?
Code: Alles auswählen
m_pPlot1 = createWidgets(0,0,width()/2. - 1,height()/2. );
m_pPlot1->setTag("Plot1");
m_pPlot1->drawPicture(PolarPlot::imgResult);
Aber das mit dem schwarz versteh ich noch nicht. Ich setze doch nur den Hintergrund auf schwarz. Und das PaintEvent malt doch auch einfach drüber?
Warum geht das dann hier nicht?