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. QPushButton setAutoExclusive(true) setChecked(false)
Forum Updated to NodeBB v4.3 + New Features

QPushButton setAutoExclusive(true) setChecked(false)

Scheduled Pinned Locked Moved General and Desktop
6 Posts 4 Posters 25.9k Views 1 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.
  • R Offline
    R Offline
    ReHa1
    wrote on last edited by
    #1

    If i set three buttons on one common widget to
    @ setCheckable(true)
    setAutoExclusive(true)
    @
    i can't set ALL buttons to unchecked state by
    @ setChecked(false)
    @
    The only workaround i found ist to set the buttons
    @ setCheckable(false)
    setCheckable(true)
    @
    for all buttons, to reset in initial, all unchecked state.

    Is this a bug?

    ReHa1

    1 Reply Last reply
    0
    • S Offline
      S Offline
      sigrid
      wrote on last edited by
      #2

      This is the expected behavior. When the autoExclusive property is enabled, checkable buttons that belong to the same parent widget behave as if they were part of the same exclusive button group. In an exclusive group, the user cannot uncheck the currently checked button by clicking on it; instead, another button in the group must be clicked to set the new checked button for that group. The same is true when unchecking the button programmatically. The following links to the documentation contain some information on this:

      http://doc.qt.nokia.com/4.7/qabstractbutton.html#autoExclusive-prop
      http://doc.qt.nokia.com/4.7/qbuttongroup.html#exclusive-prop

      1 Reply Last reply
      0
      • R Offline
        R Offline
        ReHa1
        wrote on last edited by
        #3

        Ok, but the initial situation (bevor a user has clicked at one of the button group) doesn't follow this definition: In this situation NO button is checked.

        How to restore this situation correct, programmatically?

        1 Reply Last reply
        0
        • S Offline
          S Offline
          sigrid
          wrote on last edited by
          #4

          In the initial situation, no button has been clicked/checked yet and hence none are set as checked at this point. Once a button has been checked however, there will always be one button that is checked when using auto-exclusive. If you wish to get around this, you can e.g enable and disable the autoexclusive property for the currently checked button, i.e as illustrated here:

          @#include <QtGui>
          class Widget : public QWidget
          {
          Q_OBJECT
          public:
          Widget()
          {
          QVBoxLayout *layout = new QVBoxLayout(this);
          button1 = new QPushButton("First", this);
          button2 = new QPushButton("Second", this);
          button3 = new QPushButton("Third", this);
          layout->addWidget(button1);
          layout->addWidget(button2);
          layout->addWidget(button3);

          button1->setCheckable(true);
          button1->setAutoExclusive(true);

          button2->setCheckable(true);
          button2->setAutoExclusive(true);

          button3->setCheckable(true);
          button3->setAutoExclusive(true);
          button3->setChecked(true);
          QTimer::singleShot(1000, this, SLOT(testSlot()));

          }
          public slots:
          void testSlot()
          {
          button1->setChecked(false);
          button2->setChecked(false);
          button3->setAutoExclusive(false);
          button3->setChecked(false);
          button3->setAutoExclusive(true);
          }
          private:
          QPushButton *button1;
          QPushButton button2;
          QPushButton button3;
          };
          #include "main.moc"
          int main(int argc, char
          argv)
          {
          QApplication app(argc, argv);
          Widget window;
          window.show();
          return app.exec();
          }@

          1 Reply Last reply
          0
          • Q Offline
            Q Offline
            QtGnomo
            wrote on last edited by
            #5

            Maybe you are looking something like this. It is a partial code I used for drawing figures on a canvas.

            @
            #include "mainwindow.h"
            #include "ui_mainwindow.h"

            QToolButton* drawLineButton; //Better declare it on header
            QToolButton* drawEllipseButton; //Better declare it on header
            QToolButton* drawPolygonButton; //Better declare it on header

            MainWindow::MainWindow(QWidget *parent) :
            QMainWindow(parent),
            ui(new Ui::MainWindow)
            {
            ui->setupUi(this);

            QToolBar* newToolBar = new QToolBar(this);
            newToolBar->setObjectName(QString::fromUtf8("newToolBar"));
            addToolBar(Qt::TopToolBarArea, newToolBar);
            
            drawLineButton = new QToolButton(this);
            drawLineButton->setCheckable(true);
            drawLineButton->setToolTip("Draw Line");
            
            drawEllipseButton = new QToolButton(this);
            drawEllipseButton->setCheckable(true);
            drawEllipseButton->setToolTip("Draw Ellipse");
            
            drawPolygonButton = new QToolButton(this);
            drawPolygonButton->setCheckable(true);
            drawPolygonButton->setToolTip("Draw Polygon");
            
            ui->mainToolBar->addWidget(drawLineButton);
            ui->mainToolBar->addWidget(drawEllipseButton);
            ui->mainToolBar->addWidget(drawPolygonButton);
            
            connect(drawLineButton, SIGNAL(toggled(bool)), this, SLOT(drawLineButtonToggled(bool)));
            connect(drawEllipseButton, SIGNAL(toggled(bool)), this, SLOT(drawEllipseButtonToggled(bool)));
            connect(drawPolygonButton, SIGNAL(toggled(bool)), this, SLOT(drawPolygonButtonToggled(bool)));
            connect(drawLineButton, SIGNAL(pressed()), this, SLOT(drawLineButtonPressed()));
            connect(drawEllipseButton, SIGNAL(pressed()), this, SLOT(drawEllipseButtonPressed()));
            connect(drawPolygonButton, SIGNAL(pressed()), this, SLOT(drawPolygonButtonPressed()));
            

            }

            MainWindow::~MainWindow()
            {
            delete ui;
            }

            void MainWindow::drawLineButtonToggled(bool in_Checked)
            {
            if (in_Checked)
            {
            // Draw the line
            }
            else
            {
            // Draw nothing
            }
            }

            void MainWindow::drawEllipseButtonToggled(bool in_Checked)
            {
            if (in_Checked)
            {
            // Draw the ellipse
            }
            else
            {
            // Draw nothing
            }
            }

            void MainWindow::drawPolygonButtonToggled(bool in_Checked)
            {
            if (in_Checked)
            {
            // Draw the polygon
            }
            else
            {
            // Draw nothing
            }
            }

            void MainWindow::drawLineButtonPressed()
            {
            if (drawLineButton->isChecked())
            {
            drawLineButton->setAutoExclusive(false);
            }
            else
            {
            drawLineButton->setAutoExclusive(true);
            }
            }

            void MainWindow::drawEllipseButtonPressed()
            {
            if (drawEllipseButton->isChecked())
            {
            drawEllipseButton->setAutoExclusive(false);
            }
            else
            {
            drawEllipseButton->setAutoExclusive(true);
            }
            }

            void MainWindow::drawPolygonButtonPressed()
            {
            if (drawPolygonButton->isChecked())
            {
            drawPolygonButton->setAutoExclusive(false);
            }
            else
            {
            drawPolygonButton->setAutoExclusive(true);
            }
            }
            @

            1 Reply Last reply
            0
            • flimaF Offline
              flimaF Offline
              flima
              wrote on last edited by flima
              #6

              A better way to unpress the buttons would be creating a unique slot connected to all pressed signals.

              it would look like this:

              void MainWindow::drawButtonPressed()
              {
                 QAbstractButton* button = static_cast<QAbstractButton*>(sender())
                 if (button->isChecked()) {
                    button->setAutoExclusive(false);
                 } else {
                    button->setAutoExclusive(true);
                 }
              }
              
              1 Reply Last reply
              2

              • Login

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