Generelle Frage![gelöst]

Verschiedenes zu Qt
Qt-nator
Beiträge: 153
Registriert: 18. Dezember 2007 10:31

Generelle Frage![gelöst]

Beitrag 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
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

Beitrag von PeterLustig »

Das Bild einfach nur in einem Widget anzeigen lassen?
Qt-nator
Beiträge: 153
Registriert: 18. Dezember 2007 10:31

Beitrag 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...
PeterLustig
Beiträge: 386
Registriert: 21. November 2007 20:07

Beitrag 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...
Qt-nator
Beiträge: 153
Registriert: 18. Dezember 2007 10:31

Beitrag 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.
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

Beitrag 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.
Qt-nator
Beiträge: 153
Registriert: 18. Dezember 2007 10:31

Beitrag 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?
dontinelli
Beiträge: 146
Registriert: 22. September 2006 20:53

Beitrag 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...
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

Beitrag 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.
Qt-nator
Beiträge: 153
Registriert: 18. Dezember 2007 10:31

Beitrag 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?
PeterLustig
Beiträge: 386
Registriert: 21. November 2007 20:07

Beitrag von PeterLustig »

Du solltest wirklich das Tutorial nochmal durchgehen und die Basics von Qt verstehen.
dontinelli
Beiträge: 146
Registriert: 22. September 2006 20:53

Beitrag 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.
Qt-nator
Beiträge: 153
Registriert: 18. Dezember 2007 10:31

Beitrag von Qt-nator »

Du meinst also ich soll

Code: Alles auswählen

drawPicture(PolarPlot::imgResult);
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.
dontinelli
Beiträge: 146
Registriert: 22. September 2006 20:53

Beitrag 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...
Qt-nator
Beiträge: 153
Registriert: 18. Dezember 2007 10:31

Beitrag 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?
Antworten