Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. updating radio buttons programmatically
Forum Updated to NodeBB v4.3 + New Features

updating radio buttons programmatically

Scheduled Pinned Locked Moved Solved General and Desktop
44 Posts 4 Posters 13.3k Views 2 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • M Offline
    M Offline
    mzimmers
    wrote on 16 Aug 2018, 14:28 last edited by mzimmers
    #11

    I use a QDataWidgetMapper object in my dialog to access the fields.

        m_mapper->addMapping(ui->ipAddress, TAG_IPV4ADDRESS);
    

    This maps a line edit to a column in my model. But I don't think I can simply do the same thing for a button group.

    EDIT: by the way, I don't have to use radio buttons for this. They seemed like a good choice, but if there's a better method, I'm happy to entertain ideas.

    P 1 Reply Last reply 16 Aug 2018, 14:42
    0
    • M mzimmers
      16 Aug 2018, 14:28

      I use a QDataWidgetMapper object in my dialog to access the fields.

          m_mapper->addMapping(ui->ipAddress, TAG_IPV4ADDRESS);
      

      This maps a line edit to a column in my model. But I don't think I can simply do the same thing for a button group.

      EDIT: by the way, I don't have to use radio buttons for this. They seemed like a good choice, but if there's a better method, I'm happy to entertain ideas.

      P Offline
      P Offline
      Pablo J. Rogina
      wrote on 16 Aug 2018, 14:42 last edited by Pablo J. Rogina
      #12

      @mzimmers said in updating radio buttons programmatically:

      I use a QDataWidgetMapper object in my dialog

      having stated this from the very beginning should have saved time and effort, and allow us to narrow down the issue... :-)

      Given that said, maybe this post may help

      Upvote the answer(s) that helped you solve the issue
      Use "Topic Tools" button to mark your post as Solved
      Add screenshots via postimage.org
      Don't ask support requests via chat/PM. Please use the forum so others can benefit from the solution in the future

      M 1 Reply Last reply 16 Aug 2018, 15:08
      0
      • P Pablo J. Rogina
        16 Aug 2018, 14:42

        @mzimmers said in updating radio buttons programmatically:

        I use a QDataWidgetMapper object in my dialog

        having stated this from the very beginning should have saved time and effort, and allow us to narrow down the issue... :-)

        Given that said, maybe this post may help

        M Offline
        M Offline
        mzimmers
        wrote on 16 Aug 2018, 15:08 last edited by
        #13

        @Pablo-J.-Rogina said in updating radio buttons programmatically:

        @mzimmers said in updating radio buttons programmatically:

        I use a QDataWidgetMapper object in my dialog

        having stated this from the very beginning should have saved time and effort, and allow us to narrow down the issue... :-)

        Sorry -- I thought I had done so here:
        https://forum.qt.io/topic/93723/updating-radio-buttons-programmatically/4

        In any event, it may be time to consider a different approach.

        SGaist: looking at your response, I have a couple questions:

        1. you mention customizing my address type widget - are you referring to the buttongroup?
        2. What do you mean by "the setter"?
        1 Reply Last reply
        0
        • S Offline
          S Offline
          SGaist
          Lifetime Qt Champion
          wrote on 16 Aug 2018, 18:57 last edited by
          #14

          I mean make a custom widget e.g.:

          class IpAddressTypeWidget : public Widget
          {
              Q_OBJECT
              Q_PROPERTY(QString addressType GET addressType SET setAddressType NOTIFY addressTypeChanged USER true)
          
          public:
              explicit IpAddressTypeWidget(QWidget *parent=nullptr);
          
              QString addressType() const;
          
          signals:
              void addressTypeChanged(const QString& type);
          
          public slots:
              void setAddressType(const QString& type);
          };
          

          In setAddressType, you update the radio buttons based on the string given. Note that you can also use an enum and it's the role of the parser to use the correct enum when changing the address type. It would be cleaner but for a first round, it might be easier to use a QString.

          Interested in AI ? www.idiap.ch
          Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

          1 Reply Last reply
          1
          • M Offline
            M Offline
            mzimmers
            wrote on 16 Aug 2018, 21:00 last edited by
            #15

            OK, I think I understand what you're suggesting, but some of the mechanics still aren't clear to me.

            Does this new widget replace any of my existing widgets, or does it just exist (invisibly) within my dialog?

            Do I need to pass it my ui pointer at construction to give it access to the rest of the widgets?

            1 Reply Last reply
            0
            • S Offline
              S Offline
              SGaist
              Lifetime Qt Champion
              wrote on 16 Aug 2018, 21:12 last edited by
              #16

              It's an independent widget where you put your QGroupBox which contains the two QRadioButton.

              Interested in AI ? www.idiap.ch
              Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

              1 Reply Last reply
              0
              • M Offline
                M Offline
                mzimmers
                wrote on 16 Aug 2018, 22:09 last edited by
                #17

                I'm still wading through this, but I did discover a necessary change in the Q_PROPERTY macro:

                    Q_PROPERTY(QString ipSource READ ipSource WRITE SetIpSource NOTIFY ipSourceChanged USER true)
                

                It wouldn't compile with the GET/SET terms.

                1 Reply Last reply
                0
                • M Offline
                  M Offline
                  mzimmers
                  wrote on 17 Aug 2018, 16:33 last edited by
                  #18

                  SGaist: in your example above, where does the signal come from that connects to the slot setAddressType()?

                  1 Reply Last reply
                  0
                  • S Offline
                    S Offline
                    SGaist
                    Lifetime Qt Champion
                    wrote on 17 Aug 2018, 19:35 last edited by
                    #19

                    IIRC, you are using a QDataWidgetMapper for that editor ? Correct, then with that definition, when you call addMapping it will use that property to get and set the data from that widget in the same manner as it does for QLineEdit or QSpinBox.

                    Interested in AI ? www.idiap.ch
                    Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                    1 Reply Last reply
                    0
                    • M Offline
                      M Offline
                      mzimmers
                      wrote on 17 Aug 2018, 19:58 last edited by
                      #20

                      OK, I think I get this in principle. From an implementation standpoint, how/when should the edit dialog retrieve this information from the custom widget -- another signal/slot?

                      Thanks...

                      1 Reply Last reply
                      0
                      • S Offline
                        S Offline
                        SGaist
                        Lifetime Qt Champion
                        wrote on 17 Aug 2018, 20:06 last edited by
                        #21

                        I'm not sure I'm following you here. Isn't that widget already using QDataWidgetMapper ?

                        Interested in AI ? www.idiap.ch
                        Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                        1 Reply Last reply
                        0
                        • M Offline
                          M Offline
                          mzimmers
                          wrote on 17 Aug 2018, 20:11 last edited by mzimmers
                          #22

                          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.

                          1 Reply Last reply
                          0
                          • S Offline
                            S Offline
                            SGaist
                            Lifetime Qt Champion
                            wrote on 19 Aug 2018, 19:48 last edited by
                            #23

                            Don't forget to emit the corresponding notification signal if the address type has changed.

                            Interested in AI ? www.idiap.ch
                            Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                            1 Reply Last reply
                            0
                            • M Offline
                              M Offline
                              mzimmers
                              wrote on 20 Aug 2018, 14:36 last edited by
                              #24

                              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?

                              1 Reply Last reply
                              0
                              • S Offline
                                S Offline
                                SGaist
                                Lifetime Qt Champion
                                wrote on 20 Aug 2018, 21:20 last edited by
                                #25

                                I was thinking about where you are emitting ipSourceChanged.

                                Interested in AI ? www.idiap.ch
                                Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                                1 Reply Last reply
                                0
                                • M Offline
                                  M Offline
                                  mzimmers
                                  wrote on 20 Aug 2018, 21:33 last edited by
                                  #26

                                  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.

                                  1 Reply Last reply
                                  0
                                  • S Offline
                                    S Offline
                                    SGaist
                                    Lifetime Qt Champion
                                    wrote on 20 Aug 2018, 21:40 last edited by
                                    #27

                                    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);
                                    }
                                    

                                    Interested in AI ? www.idiap.ch
                                    Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                                    1 Reply Last reply
                                    1
                                    • M Offline
                                      M Offline
                                      mzimmers
                                      wrote on 20 Aug 2018, 21:44 last edited by
                                      #28

                                      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.

                                      1 Reply Last reply
                                      0
                                      • S Offline
                                        S Offline
                                        SGaist
                                        Lifetime Qt Champion
                                        wrote on 20 Aug 2018, 21:50 last edited by
                                        #29

                                        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);
                                        }
                                        

                                        Interested in AI ? www.idiap.ch
                                        Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                                        1 Reply Last reply
                                        1
                                        • M Offline
                                          M Offline
                                          mzimmers
                                          wrote on 20 Aug 2018, 21:53 last edited by mzimmers
                                          #30

                                          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?

                                          1 Reply Last reply
                                          0

                                          20/44

                                          17 Aug 2018, 19:58

                                          • Login

                                          • Login or register to search.
                                          20 out of 44
                                          • First post
                                            20/44
                                            Last post
                                          0
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular
                                          • Users
                                          • Groups
                                          • Search
                                          • Get Qt Extensions
                                          • Unsolved