Seite 1 von 2
Generelle Frage![gelöst]
Verfasst: 26. Mai 2008 14:30
von Qt-nator
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
Verfasst: 26. Mai 2008 14:42
von PeterLustig
Das Bild einfach nur in einem Widget anzeigen lassen?
Verfasst: 26. Mai 2008 14:58
von Qt-nator
Ich post mal bisschen Code vieleicht versteht mans dann besser.
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;
}
Hier lade ich das Bild:
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);
}
Ja und wenn ich dann eins Lade sind alle Voll...
Verfasst: 26. Mai 2008 15:01
von PeterLustig
Warum benutzt du sowas wie create Widgets mit Koordinaten? Benutz dafür doch Layouts. :s
Du solltest dem Widget, auf dem du ein Bild anzeigen wilslt, ein QLabel hinzufügen und in diesem das Bild anzeigen. Dafür ist das Widget da. Und dann eben nur dem einen QLabel das Bild zuweisen...
Verfasst: 26. Mai 2008 15:06
von Qt-nator
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.
Verfasst: 26. Mai 2008 15:11
von PeterLustig
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.
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: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???
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).
Ü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.
Verfasst: 26. Mai 2008 15:17
von Qt-nator
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?
Verfasst: 26. Mai 2008 15:18
von dontinelli
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...
Verfasst: 26. Mai 2008 15:19
von PeterLustig
Richtig verstanden.
Es ist auch so mit Widgets umsetzbar, aber es ist harmlos ausgedrückt: Schwachsinnig.
Und ich hab jetzt Vorlesung und bin weg.
Verfasst: 26. Mai 2008 15:25
von Qt-nator
Gut das ich das schonmal verstanden habe.
@ 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;
}
Aber dann bekommen doch wieder alle das selbe Bild?
Verfasst: 26. Mai 2008 17:10
von PeterLustig
Du solltest wirklich das Tutorial nochmal durchgehen und die Basics von Qt verstehen.
Verfasst: 26. Mai 2008 17:25
von dontinelli
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.
Verfasst: 27. Mai 2008 10:02
von Qt-nator
Du meinst also ich soll
Hierhin verschieben?
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;
}
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.
Verfasst: 27. Mai 2008 10:31
von dontinelli
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...
Verfasst: 27. Mai 2008 10:41
von Qt-nator
Dann meinst du ich sollte es hier einfügen:
Code: Alles auswählen
m_pPlot1 = createWidgets(0,0,width()/2. - 1,height()/2. );
m_pPlot1->setTag("Plot1");
m_pPlot1->drawPicture(PolarPlot::imgResult);
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?