@JonB , ok, this is my class prototype:
typedef std::map<const QString, QButtonGroup*> mpGroups;
class clsQtLayout : public QWidget, public clsXMLinterface {
private:
mpGroups* mmpGroups;
QLayout* mpobjLO;
QScrollArea* mpobjScroller;
public:
explicit clsQtLayout(clsXMLnode* pobjNode, QString* pstrCSS
, QWidget* pobjParent);
~clsQtLayout();
void addButton(QAbstractButton* pobjButton, const QString& crstrGroup);
void addWidget(QWidget *pobjWidget);
bool blnIsLayout() { return true; }
QButtonGroup* pobjAddGroup(const QString& crstrGroup);
QLayout* pobjGetLayout() { return mpobjLO; }
QScrollArea* pobjGetScroller() { return mpobjScroller; }
};
Implementation:
/**
* @brief clsQtLayout::clsQtLayout
* @param pobjNode : Pointer to XML node
* @param pstrCSS : Pointer to CSS
* @param pobjParent : Pointer to parent widget
*/
clsQtLayout::clsQtLayout(clsXMLnode* pobjNode, QString* pstrCSS
, QWidget* pobjParent)
: QWidget(pobjParent)
, clsXMLinterface(pobjNode)
, mmpGroups(nullptr)
, mpobjLO(nullptr) {
Q_ASSERT_X(pobjNode!=nullptr, QString("%1::%1").arg(metaObject()->className()
,metaObject()->className())
.toLatin1().data()
, "No node supplied!");
QString strID(pobjNode->strGetAttribute(clsXMLnode::mscszAttrID))
,strHeight(mpobjNode->strGetAttribute(clsXMLnode::mscszAttrHeight))
,strHorzSpacing(mpobjNode->strGetAttribute(
clsXMLnode::mscszAttrSpacingH))
,strName
,strType(pobjNode->strGetAttribute(clsXMLnode::mscszAttrType))
,strVertSpacing(mpobjNode->strGetAttribute(
clsXMLnode::mscszAttrSpacingV))
,strWidth(mpobjNode->strGetAttribute(clsXMLnode::mscszAttrWidth));
strName = QString("%1: %2").arg(clsXMLnode::mscszNameLayout, strType);
if ( strID.isEmpty() != true ) {
strName += QString(", %1: %2").arg(clsXMLnode::mscszNameID, strID);
}
clsXMLnode::setObjName(*this, strName);
if ( strType.compare(clsXMLnode::mscszLayoutForm) == 0 ) {
//Set-up form
QFormLayout* pobjForm(new QFormLayout);
clsXMLnode::setObjName(*pobjForm, QString("%1, %2").arg(strName
, pobjForm->metaObject()->className()));
pobjForm->setContentsMargins(0,0,0,0);
pobjForm->setSpacing(0);
setLayout(pobjForm);
//Any spacing to apply?
if ( strHorzSpacing.isEmpty() != true ) {
int intHorzSpacing(strHorzSpacing.toInt());
if ( intHorzSpacing >= 0 ) {
pobjForm->setHorizontalSpacing(intHorzSpacing);
}
}
if ( strVertSpacing.isEmpty() != true ) {
int intVertSpacing(strVertSpacing.toInt());
if ( intVertSpacing >= 0 ) {
pobjForm->setVerticalSpacing(intVertSpacing);
}
}
mpobjLO = pobjForm;
} else if ( strType.compare(clsXMLnode::mscszLayoutGrid) == 0 ) {
QGridLayout* pobjGrid(new QGridLayout);
clsXMLnode::setObjName(*pobjGrid, QString("%1, %2").arg(strName
, pobjGrid->metaObject()->className()));
pobjGrid->setContentsMargins(0,0,0,0);
pobjGrid->setSpacing(0);
setLayout(pobjGrid);
mpobjLO = pobjGrid;
} else if ( strType.compare(clsXMLnode::mscszLayoutHorizontal) == 0 ) {
QHBoxLayout* pobjHBox(new QHBoxLayout);
clsXMLnode::setObjName(*pobjHBox, QString("%1, %2").arg(strName
, pobjHBox->metaObject()->className()));
pobjHBox->setContentsMargins(0,0,0,0);
pobjHBox->setSpacing(0);
setLayout(pobjHBox);
mpobjLO = pobjHBox;
} else if ( strType.compare(clsXMLnode::mscszLayoutVertical) == 0 ) {
QVBoxLayout* pobjVBox(new QVBoxLayout);
clsXMLnode::setObjName(*pobjVBox, QString("%1, %2").arg(strName
, pobjVBox->metaObject()->className()));
pobjVBox->setContentsMargins(0,0,0,0);
pobjVBox->setSpacing(0);
setLayout(pobjVBox);
mpobjLO = pobjVBox;
}
mpobjScroller = new QScrollArea;
clsXMLnode::setObjName(*mpobjScroller, QString("%1, %2").arg(strName
, mpobjScroller->metaObject()->className()));
mpobjScroller->setWidget(this);
if ( strHeight.isEmpty() != true ) {
int intHeight(strHeight.toInt());
if ( intHeight >= 0 ) {
mpobjScroller->setFixedHeight(intHeight);
}
}
if ( strWidth.isEmpty() != true ) {
int intWidth(strWidth.toInt());
if ( intWidth >= 0 ) {
mpobjScroller->setFixedWidth(intWidth);
}
}
if ( pstrCSS != nullptr && pstrCSS->isEmpty() != true ) {
mpobjScroller->setStyleSheet(*pstrCSS);
}
mpobjScroller->setWidgetResizable(true);
}
/**
* @brief clsQtLayout::~clsQtLayout
*/
clsQtLayout::~clsQtLayout() {
if ( mmpGroups != nullptr ) {
for( mpGroups::iterator itGrp=mmpGroups->begin();
itGrp!=mmpGroups->end(); itGrp++ ) {
QButtonGroup* pobjBtnGrp(itGrp->second);
pobjBtnGrp->deleteLater();
}
delete mmpGroups;
}
if ( mpobjScroller != nullptr ) {
mpobjScroller->deleteLater();
}
if ( mpobjLO != nullptr ) {
mpobjLO->deleteLater();
}
}
/**
* @brief clsQtLayout::addButton
* @param pobjButton : Pointer to button
* @param crstrGroup : Constant reference to button group
*/
void clsQtLayout::addButton(QAbstractButton* pobjButton, const QString& crstrGroup) {
if ( pobjButton == nullptr ) {
return;
}
if ( crstrGroup.isEmpty() != true ) {
QButtonGroup* pobjBtnGrp(pobjAddGroup(crstrGroup));
if ( pobjBtnGrp != nullptr ) {
pobjBtnGrp->addButton(pobjButton);
}
}
if ( mpobjLO != nullptr && mpobjNode != nullptr ) {
QString strType(mpobjNode->strGetAttribute(clsXMLnode::mscszAttrType));
if ( strType.compare(clsXMLnode::mscszLayoutForm) == 0 ) {
QFormLayout* pobjForm(qobject_cast<QFormLayout*>(mpobjLO));
if ( pobjForm != nullptr ) {
pobjForm->addWidget(pobjButton);
}
} else if ( strType.compare(clsXMLnode::mscszLayoutGrid) == 0 ) {
QGridLayout* pobjGrid(qobject_cast<QGridLayout*>(mpobjLO));
if ( pobjGrid == nullptr ) {
return;
}
//Get a pointer to the widget based on its type
clsXMLinterface* pobjInterface(reinterpret_cast<clsXMLinterface*>
(pobjButton));
clsXMLnode* pobjNode(nullptr);
if ( pobjInterface != nullptr ) {
pobjNode = pobjInterface->pobjGetNode();
}
if ( pobjNode == nullptr ) {
return;
}
QString strColumnNo(pobjNode->strGetAttribute(
clsXMLnode::mscszAttrColumnNo))
,strRowNo(pobjNode->strGetAttribute(
clsXMLnode::mscszAttrRowNo));
int intColumn(-1), intRow(-1);
if ( strColumnNo.isEmpty() != true ) {
intColumn = strColumnNo.toInt();
}
if ( strRowNo.isEmpty() != true ) {
intRow = strRowNo.toInt();
}
if ( intColumn != -1 && intRow != -1 ) {
pobjGrid->addWidget(pobjButton, intRow, intColumn);
}
} else if ( strType.compare(clsXMLnode::mscszLayoutHorizontal) == 0 ) {
QHBoxLayout* pobjHBox(qobject_cast<QHBoxLayout*>(mpobjLO));
if ( pobjHBox != nullptr ) {
pobjHBox->addWidget(pobjButton);
}
} else if ( strType.compare(clsXMLnode::mscszLayoutVertical) == 0 ) {
QVBoxLayout* pobjVBox(qobject_cast<QVBoxLayout*>(mpobjLO));
if ( pobjVBox != nullptr ) {
pobjVBox->addWidget(pobjButton);
}
}
}
}
/**
* @brief clsQtLayout::addWidget
* @param pobjWidget Pointer to widget to add
*/
void clsQtLayout::addWidget(QWidget *pobjWidget) {
if ( pobjWidget != nullptr ) {
QLayout* pobjLayout(layout());
if ( pobjLayout != nullptr ) {
pobjLayout->addWidget(pobjWidget);
}
}
}
/**
* @brief clsQtLayout::pobjAddGroup
* @param crstrGroup : Group ID
* @return Pointer to QButtonGroup
*/
QButtonGroup* clsQtLayout::pobjAddGroup(const QString& crstrGroup) {
QButtonGroup* pobjBtnGrp(nullptr);
if ( crstrGroup.isEmpty() != true ) {
if ( mmpGroups == nullptr ) {
mmpGroups = new mpGroups;
}
mpGroups::iterator itGrp(mmpGroups->find(crstrGroup));
if ( itGrp != mmpGroups->end() ) {
pobjBtnGrp = itGrp->second;
} else {
pobjBtnGrp = new QButtonGroup(this);
clsXMLnode::setObjName(*pobjBtnGrp, QString("%1, %2: %3")
.arg(objectName()
,pobjBtnGrp->metaObject()->className()
,crstrGroup));
mmpGroups->insert(std::make_pair(crstrGroup, pobjBtnGrp));
}
}
return pobjBtnGrp;
}
Sample of setting of the XML:
<layout id="rdoLO" height="56" hspacing="0" scrollbar="false"
eol="true" type="grid"
vspacing="0" properties="QLayout {background-color:#ffaaaa;}">
<buttongroup id="enSEX">
<radiobutton id="rdoM" height="28" text="Male" default="true"/>
<radiobutton id="rdoF" height="28" text="Female"/>
</buttongroup>
</layout>
And a screenshot of this:
[image: e32b76a2-4129-4f04-8149-a0fc917e8aaf.png]
Would setting the size policy of the layout to Minimum help ?
Nope, tried setting size policy on containing widget and then scroller, neither worked using:
setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
No difference at all.