Seite 1 von 1

Widgets mittels layout nachträglich skalieren!?

Verfasst: 10. Juli 2007 16:15
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

Verfasst: 11. Juli 2007 07:16
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.

Verfasst: 12. Juli 2007 20:11
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

Verfasst: 13. Juli 2007 07:13
von macman
Bekommst Du es auf ein Beispiel gestutzt? Dann kann man es sich mal angucken.