updating radio buttons programmatically
-
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.
-
OK, I created a new QT designer form class. I'm getting compile errors that suggest my class is incomplete.
Here's my header file; what might I be missing?
#include <QGroupBox> namespace Ui { class IpSource; } class IpSource : public QGroupBox { Q_OBJECT Q_PROPERTY(QString ipSource READ ipSource WRITE setIpSource NOTIFY ipSourceChanged USER true) public: explicit IpSource(QWidget *parent = nullptr); ~IpSource(); QString ipSource() const; signals: void ipSourceChanged(const QString &source); public slots: void setIpSource(const QString &source); private: Ui::IpSource *ui; };
And the start of my c'tor:
IpSource::IpSource(QWidget *parent) : QGroupBox(parent), ui(new Ui::IpSource) { ...
I get this:
C:\Users\MZimmers\CD desktop apps\Qt projects\wb_utility\ipsource.cpp:6: error: invalid use of incomplete type 'class Ui::IpSource'
ui(new Ui::IpSource)
^ // caret pointing to IpSource -
-
@medyakovvit thanks for looking. Yes, I do have that. Here's the start of my source file:
#include "ipsource.h" #include "ui_ipsource.h" IpSource::IpSource(QWidget *parent) : QGroupBox(parent), ui(new Ui::IpSource) { ui->setupUi(this); }
-
@mzimmers Check that "ui_ipsource.h" contains what you expect.
-
I've added a Widget to my edit dialog, and promoted it to class IpSource. It displays correctly, but I can't access it programmatically, at least not with the "ui->" pointer I'm accustomed to using.
Did I miss a step? I've never used promotions before.
EDIT: this question is irrelevant to the thread, so I'm going to ask it in a separate thread.
-
OK, I believe I now have this beaten into submission. Here's my understanding of the necessary ingredients:
- upon determining the need for an internal (programmatic) change to the status of the radio buttons, the model needs to be set or updated appropriately:
// the IP configuration source. QString qs = QString::fromStdString(msg->getValue(msgTag[TAG_IP_CONFIG_SRC])); QVariant qv = m_model->data(m_model->index(row, TAG_IP_CONFIG_SRC)); if (qs != qv) { m_model->setData(m_model->index(row, TAG_IP_CONFIG_SRC), qs); emit ipSourceChanged(qs); }
- a custom designer class, based on QGroupBox, is necessary:
class IpSource : public QGroupBox { Q_OBJECT Q_PROPERTY(QString ipSource READ ipSource WRITE setIpSource NOTIFY ipSourceChanged USER true) public: explicit IpSource(QWidget *parent = nullptr); ~IpSource(); QString ipSource() const; signals: void ipSourceChanged(const QString &source); public slots: void setIpSource(const QString &source); private: Ui::IpSource *ui;
- from your parent dialog (if that's the right term), create an empty widget, and promote it to your custom widget.
- the syntax for retrieving the value of the radio button group was a little tricky at first, but it goes like this:
string s = ui->ipSource->ipSource().toStdString();
(you can ignore the StdString part if you're just using QStrings; I have to share my constants header file with a firmware app.
If anyone feels that the above needs correction/improvement, please let me know.
Thanks to everyone who helped on this.