updating radio buttons programmatically
-
IIRC, you are using a
QDataWidgetMapper
for that editor ? Correct, then with that definition, when you calladdMapping
it will use that property to get and set the data from that widget in the same manner as it does forQLineEdit
orQSpinBox
. -
I'm not sure I'm following you here. Isn't that widget already using
QDataWidgetMapper
? -
Yes:
in editdialog.cpp
IpSourceWidget m_isw; // IpSourceWidget is my custom widget m_mapper->addMapping(&m_isw, TAG_IP_CONFIG_SRC);
But don't I still have to use this to update the group box? Like this:
if (qs.toStdString() == IP_SOURCE_TXT[IP_SOURCE_DHCP]) { ui->groupBoxIpAssignment->setChecked(IP_SOURCE_DHCP); } else { ui->groupBoxIpAssignment->setChecked(IP_SOURCE_STATIC); }
EDIT: OK, that wasn't right. I changed it to this:
QButtonGroup *m_qbg; // button group for IP source selection. ... if (qs.toStdString() == IP_SOURCE_TXT[IP_SOURCE_DHCP]) { m_qbg->button(IP_SOURCE_DHCP)->setChecked(true); } else { m_qbg->button(IP_SOURCE_STATIC)->setChecked(true); }
This at least gets the correct value displaying in the edit dialog. Still not sure I'm really doing this right, though.
-
Don't forget to emit the corresponding notification signal if the address type has changed.
-
Not sure I understand. The code above is in a slot in my edit dialog. Elsewhere I have a connect:
IpSourceWidget *m_isw; ... QObject::connect(m_isw, &IpSourceWidget::ipSourceChanged, this, &EditDialog::updateIpSource);
Is this the signal you're referring to?
-
I was thinking about where you are emitting
ipSourceChanged
. -
Well, maybe that's part of the problem...I wasn't aware I needed to use that signal.
I'm still feeling my way through this. My IpSource widget doesn't contain any display items; it just handles the model updating. It communicates with the edit dialog through some shared variables:
IpSourceWidget::IpSourceWidget(QWidget *parent, DeviceModel *d, QModelIndex *qmi) : QWidget(parent), m_d(d), m_qmi(qmi) { } IpSourceWidget::~IpSourceWidget() { } QString IpSourceWidget::ipSource() const { return QString::fromStdString(IP_SOURCE_TXT[m_ics]); } void IpSourceWidget::setIpSource(const QString &source) { m_d->getModel()->setData(*m_qmi, source); }
I'm getting unexpected results, though. For example, after I press my "commit" button, the argument passed into setIpSource is set to "false." No idea where that's coming from.
-
Why does IpSourceWidget know about DeviceModel and the corresponding QModelIndex ?
The idea behind that widget is that you use it the same way as the QLineEdit you have in your editor widget.
For example in a widget like QLineEdit you have something like:
void MyWidget::setMyStringProperty(const QString &newValue) { if (newValue == currentValue) { return; } currentValue = newValue; // Do stuff if needed emit myStringPropertyValueChanged(newValue); }
-
None of my other widgets require me to do anything other than calls to addMapping(). That's partly why this is so new to me.
In your example, is currentValue a member variable (or a persistent local), or am I obtaining it from the model? I originally thought the latter, but now I'm thinking I got it wrong.
-
Most of the time, it's a member variable.
In the case of your widget, it could be something like:
void IpSourceWidget::setIpSource(const QString& ipSource) { if ((ipSource == IP_SOURCE_DHCP && ui->dhcpButton->isChecked()) || ipSource == IP_SOURCE_STATIC && ui->staticButton->isChecked())) { return; } if (ipSource == IP_SOURCE_DHCP) { ui->dhcpButton->setChecked(true); } else { ui->staticButton->setChecked(true); } emit ipSourceChanged(ipSource); }
-
That all makes sense, but who consumes the signal? You've already updated the ui, so the dialog doesn't need it (that I can see).
Thanks...
EDIT: oh, and continuing with this design, I guess the ipSource widget would merely return the member variable?
-
In this case, QDataWidget mapper will use it. Because you also have to implement the handling of that signal when you click on either of the radio button.
As for the getter:
QString IpSourceWidget::ipSource() const { QString sourceType = "Unkown"; if (ui->dhcpButton->isChecked() { sourceType = IP_SOURCE_DHCP ; } else { sourceType = IP_SOURCE_STATIC; } return sourceType; }
-
OK, this is starting to come together. Now...as I mentioned above, currently none of the display widgets (radio button or group box) reside in my custom widget. Is this a problem, or is there some way for me to access the widgets in the dialog ui (perhaps passing the ui variable in the c'tor)?
-
The group box and buttons should be moved out of your original editor widget and into IpSourceWidget.
-
I could have wrote it clearer. Remove them from your original editor and either use designer to create the IpSourceWidget UI or do it by code.
-
I think you might be overcomplicating how things are working. IpSourceWidget is just a widget that's slightly more complex than a QLineEdit. In your editor widget, put an empty widget where IpSourceWidget should be and then use the promote feature to use it.
Or, in the constructor of your editor widget, you can prepend an instance of IpSourceWidget to the layout you are using for your editor widget.