Widgets mittels layout nachträglich skalieren!?

Alles rund um die Programmierung mit Qt
Antworten
ghostrifle
Beiträge: 3
Registriert: 19. Oktober 2006 11:22

Widgets mittels layout nachträglich skalieren!?

Beitrag von ghostrifle »

Hi Leute,

ich habe ein kleines Problem was die Layouts in meinem Programm angeht.

Ich habe ein Widget welches ein QVBoxLayout benutzt um ein Gridlayout mit ensprechenden Widgets anzuzeigen.

Sobald sich ein bestimmer Wert dieser Widgets ändert, werden zwei selbstprogrammierte Diagramwidgets angezeigt welches zu dem QVBoxLayout vorher hinzugefügt wurden. (bei initialisierung hide() sobald sich ein wert ändert lass ich sie mittels show() anzeigen)

Wie ihr am den angehängten Screenshot sehen könnt klappt das zwar aber das Widget wird anscheinend nicht skaliert. die Diagramme haben eine Mindestgrösse angegeben, der wird aber wohl nicht beachtet.

Hier noch ein wenig Code des Widgets:

Code: Alles auswählen

m_pWidgetLayout = new QVBoxLayout(this);
	
	m_pLayout = new QGridLayout(this);
	
	m_pLayout->addWidget(new QLabel("Datenquelle",this),0,0);
	m_pLE_wSource = new SourceWidget(this);
	m_pLE_wSource->setValue(m_pStructure->wSource);
	m_pLayout->addWidget(m_pLE_wSource,0,1);
	connect(m_pLE_wSource,SIGNAL(valueChanged()),this,SLOT(sourceChanged()));

	m_pLayout->addWidget(new QLabel("min. Sensorbereich",this),1,0);
	m_pLE_cSensorMin = new QLineEdit(this);
	m_pLE_cSensorMin->setText(QString().setNum(m_pStructure->cSensorMin));
	m_pLayout->addWidget(m_pLE_cSensorMin,1,1);

	m_pLayout->addWidget(new QLabel("max. Sensorbereich",this),2,0);
	m_pLE_cSensorMax = new QLineEdit(this);
	m_pLE_cSensorMax->setText(QString().setNum(m_pStructure->cSensorMax));
	m_pLayout->addWidget(m_pLE_cSensorMax,2,1);

	m_pLabelcRefValue = new QLabel(tr("Verstärkungsfaktor der CAN-DATEN"),this);
	m_pLayout->addWidget(m_pLabelcRefValue ,3,0);
	m_pLE_cRefValue = new QLineEdit(this);
	//m_pLE_fStuetz->setText(QString().setNum(m_pStructure->fStuetz));
	m_pLayout->addWidget(m_pLE_cRefValue,3,1);
	
	m_pDiagramRefValue = new DiagramWidget(this,tr("Stützpunkte auf der Kennlinie")); // wird nicht automatisch angezeigt
	QStringList values;
	QStringList names;
	
	for(int i = 0; i < 6; i++)
	{
		values << QString().setNum(m_pStructure->cRefValue[i]);
		names << QString("Stützpunkt %1").arg(i);
	}
	
	m_pDiagramRefValue->setValues(names,values);
	
	m_pLabelStuetz = new QLabel(tr("Nachrichtentimeout"),this);
	m_pLayout->addWidget(m_pLabelStuetz ,4,0);
	m_pLE_fStuetz = new QLineEdit(this);
	//m_pLE_fStuetz->setText(QString().setNum(m_pStructure->fStuetz));
	m_pLayout->addWidget(m_pLE_fStuetz,4,1);
	
	m_pDiagramStuetz = new DiagramWidget(this,tr("Stützpunkte auf der Kennlinienabschnitte")); // wird nicht automatisch angezeigt
	for(int i = 0; i < 6; i++)
	{
		values << QString().setNum(m_pStructure->fStuetz[i]);
		names << QString("Stützpunkt %1").arg(i);
	}
	
	m_pDiagramStuetz->setValues(names,values);
	
	m_pLayout->addWidget(new QLabel("Offset",this),5,0);
	m_pLE_fOffset = new QLineEdit(this);
	m_pLE_fOffset->setText(QString().setNum(m_pStructure->fOffset));
	m_pLayout->addWidget(m_pLE_fOffset,5,1);

	m_pLayout->addWidget(new QLabel("Empfangs ID",this),6,0);
	m_pLE_dwCanID = new QLineEdit(this);
	m_pLE_dwCanID->setText(FormatConv::longToHex(m_pStructure->dwCanID));
	m_pLayout->addWidget(m_pLE_dwCanID,6,1);

	m_pLayout->addWidget(new QLabel("Verzögerungszeit der Sensorprüfung Basis 500ms",this),7,0);
	m_pLE_cCheckDelay = new QLineEdit(this);
	m_pLE_cCheckDelay->setText(QString().setNum(m_pStructure->cCheckDelay));
	m_pLayout->addWidget(m_pLE_cCheckDelay,7,1);
	
	OkButton *pOKButton = new OkButton(this);
	m_pLayout->addWidget(pOKButton,8,1);
	
	connect(pOKButton,SIGNAL(clicked(bool)),this,SLOT(saveValues(bool)));
	
	// layout
	m_pWidgetLayout->addLayout(m_pLayout);
	
	m_pWidgetLayout->addWidget(m_pDiagramRefValue);
	m_pDiagramRefValue->hide();
	
	m_pWidgetLayout->addWidget(m_pDiagramStuetz);
	m_pDiagramStuetz->hide();
	
	setLayout(m_pWidgetLayout);
Code wenn sich ein bestimmer Wert ändert:

Code: Alles auswählen

if(m_pLE_wSource->indexOfEingang() > 1)
	{
		// es wurden io eingänge ausgewählt, also werden die diagramme angezeigt
		m_pLabelcRefValue->hide();
		m_pLabelStuetz->hide();
		m_pLE_cRefValue->hide();
		m_pLE_fStuetz->hide();
		
		m_pDiagramRefValue->show();
		
		m_pDiagramStuetz->show();
	}
	else
	{
		m_pLabelcRefValue->show();
		m_pLE_cRefValue->show();
		
		m_pLabelStuetz->show();
		m_pLE_fStuetz->show();
		
		
		
		m_pDiagramRefValue->hide();
		m_pDiagramStuetz->hide();
	}
	
	m_pLayout->update();
	m_pWidgetLayout->update();
Ich bin mir sicher dass es kein grosses Problem ist, aber leider komm ich einfach nicht auf die Lösung.

Bin für jede Hilfe dankbar !

Grüsse Alex
Dateianhänge
Screen-Beispiel
Screen-Beispiel
beispiel.jpg (109.77 KiB) 1441 mal betrachtet
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

Ich habe mir deinen Code nicht genau angeschaut. In solchen Fällen erstelle ich den Dialog mit allen Elementen und blende die aus, die nicht benötigt werden. In manchen Fällen will das Layout nicht so wie ich, dann helfe ich mit einem setzen der Höhe des Dialoges nach, wenn etwas aus/eingeblendet wird.
Die deutsche Schriftsprache ist case-sensitive. Außerdem gibt es eine Interpunktionsnorm. Wenn manch einer seine Programme genauso schlampig schreibt, wie sein Posting hier, dann sollte er es lieber bleiben lassen.
ghostrifle
Beiträge: 3
Registriert: 19. Oktober 2006 11:22

Beitrag von ghostrifle »

Hi,

genauso mache ich es ja, aber trotzdem passiert der Fehler von dem Beispielfoto !

auch updateGeometry() oder so bringt mir leider nicht den gewollten Effekt.

Grüsse Alex
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

Bekommst Du es auf ein Beispiel gestutzt? Dann kann man es sich mal angucken.
Die deutsche Schriftsprache ist case-sensitive. Außerdem gibt es eine Interpunktionsnorm. Wenn manch einer seine Programme genauso schlampig schreibt, wie sein Posting hier, dann sollte er es lieber bleiben lassen.
Antworten