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. selectionChanged() not called when item selected with setCurrentIndex() is deselected
Forum Updated to NodeBB v4.3 + New Features

selectionChanged() not called when item selected with setCurrentIndex() is deselected

Scheduled Pinned Locked Moved Unsolved General and Desktop
11 Posts 3 Posters 2.4k 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.
  • E Offline
    E Offline
    EaccB
    wrote on last edited by
    #1

    I move through a QListView with Previous and Next buttons. I do this with setCurrentIndex(), using the currently selected index +/-1, and QItemSelectionModel::SelectCurrent.

    However, if the item is deselected with CTRL+click, selectionChanged() is not emitted as it is if I had clicked on the item and then deselected. So, how can I select an item in the list such that it is the same as if I had clicked on it?

    1 Reply Last reply
    0
    • SGaistS Offline
      SGaistS Offline
      SGaist
      Lifetime Qt Champion
      wrote on last edited by SGaist
      #2

      Hi,

      So you move the selection with your button and then "unselect" it with the mouse and this does not trigger the signal ?

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

      E 1 Reply Last reply
      0
      • SGaistS SGaist

        Hi,

        So you move the selection with your button and then "unselect" it with the mouse and this does not trigger the signal ?

        E Offline
        E Offline
        EaccB
        wrote on last edited by EaccB
        #3

        @SGaist

        That is correct.
        If I select the item by clicking on it and then deselecting, it works fine.

        The index to select the next item is calculated: index(selection.indexes().at(0).row() + 1, 0)

        1 Reply Last reply
        0
        • SGaistS Offline
          SGaistS Offline
          SGaist
          Lifetime Qt Champion
          wrote on last edited by
          #4

          Which version of Qt are you using ?

          Can you provide a minimal compilable example that shows this behaviour ?

          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
          • E Offline
            E Offline
            EaccB
            wrote on last edited by EaccB
            #5

            Using Qt_5_13_1. I'm using a custom model and delegate and QSortFilterProxyModel.
            Just tried reproducing using QStringListModel and it woks fine. Not really sure where I should be looking.

            1 Reply Last reply
            0
            • E Offline
              E Offline
              EaccB
              wrote on last edited by EaccB
              #6

              I notice that using the keyboard arrow keys works, so I could replicate the way in which they make a selection, if you know how that's done? Also important to point out that deselecting the item does "un-highlight" it, so clearly the deselection is being registered somewhere.

              1 Reply Last reply
              0
              • E Offline
                E Offline
                EaccB
                wrote on last edited by
                #7

                @SGaist,

                I've written a test application which demonstrates this behaviour. How/where can I host this? Looks like the forum doesn't allow attachments.

                1 Reply Last reply
                0
                • Christian EhrlicherC Online
                  Christian EhrlicherC Online
                  Christian Ehrlicher
                  Lifetime Qt Champion
                  wrote on last edited by
                  #8

                  Create a bug report, attach the testcase.
                  But since the example should not be longer than 50 lines (at least I would expect this from your description) and doesn't need a ui file you can also paste it here (don't forget the code tags!)

                  Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
                  Visit the Qt Academy at https://academy.qt.io/catalog

                  1 Reply Last reply
                  1
                  • E Offline
                    E Offline
                    EaccB
                    wrote on last edited by
                    #9

                    @SGaist @Christian-Ehrlicher ,

                    The problem appears to be related to the use of QSortFilterProxyModel. The following example uses QStringListModel and QSortFilterProxyModel for sorting in ascending order:

                    #ifndef MAINWINDOW_H
                    #define MAINWINDOW_H
                    
                    #include <QMainWindow>
                    #include <QStringList>
                    #include <QStringListModel>
                    #include <QAbstractItemView>
                    
                    QT_BEGIN_NAMESPACE
                    namespace Ui { class MainWindow; }
                    QT_END_NAMESPACE
                    
                    class MainWindow : public QMainWindow
                    {
                        Q_OBJECT
                    
                    public:
                        MainWindow(QWidget *parent = nullptr);
                        ~MainWindow();
                    
                        void newSelection(const QItemSelection &selected, const QItemSelection &deselected);
                    
                    private slots:
                        void on_add_clicked();
                    
                        void on_insert_clicked();
                    
                        void on_delete_2_clicked();
                    
                    
                    
                        void on_selectItem2_clicked();
                    
                    private:
                        Ui::MainWindow *ui;
                        QStringListModel *model;
                    };
                    #endif // MAINWINDOW_H
                    
                    
                    #include "mainwindow.h"
                    #include "ui_mainwindow.h"
                    
                    #include <QSortFilterProxyModel>
                    
                    MainWindow::MainWindow(QWidget *parent)
                        : QMainWindow(parent)
                        , ui(new Ui::MainWindow)
                    {
                        ui->setupUi(this);
                    
                        // Create model
                            model = new QStringListModel(this);
                    
                            // Make data
                            QStringList List;
                            List << "Clair de Lune" << "Reverie" << "Prelude";
                    
                            // Populate our model
                            model->setStringList(List);
                    
                            // Glue model and view together
                            ui->listView->setModel(model);
                            ui->comboBox->setModel(model);
                            QSortFilterProxyModel* proxy = new QSortFilterProxyModel();
                            proxy->setSourceModel(model);
                            proxy->setSortRole(Qt::DisplayRole);
                            proxy->setDynamicSortFilter(true);
                            ui->listView->setModel(proxy);
                            proxy->sort(0);
                    
                            // Add additional feature so that
                            // we can manually modify the data in ListView
                            // It may be triggered by hitting any key or double-click etc.
                            ui->listView->
                                    setEditTriggers(QAbstractItemView::AnyKeyPressed |
                                                    QAbstractItemView::DoubleClicked);
                            QItemSelectionModel* selectionModel = ui->listView->selectionModel();
                            connect(selectionModel, &QItemSelectionModel::selectionChanged, this, &MainWindow::newSelection);
                    }
                    
                    MainWindow::~MainWindow()
                    {
                        delete ui;
                    }
                    
                    
                    void MainWindow::on_add_clicked()
                    {
                        // Add button clicked
                            // Adding at the end
                    
                            // Get the position
                            int row = model->rowCount();
                    
                            // Enable add one or more rows
                            model->insertRows(row,1);
                    
                            // Get the row for Edit mode
                            QModelIndex index = model->index(row);
                    
                            // Enable item selection and put it edit mode
                            ui->listView->setCurrentIndex(index);
                            ui->listView->edit(index);
                    }
                    
                    void MainWindow::on_insert_clicked()
                    {
                        // Insert button clicked
                    
                            // Get the position
                            int row = ui->listView->currentIndex().row();
                    
                            // Enable add one or more rows
                            model->insertRows(row,1);
                    
                            // Get row for Edit mode
                            QModelIndex index = model->index(row);
                    
                            // Enable item selection and put it edit mode
                            ui->listView->setCurrentIndex(index);
                            ui->listView->edit(index);
                    }
                    
                    void MainWindow::on_delete_2_clicked()
                    {
                        // Delete button clicked
                            // For delete operation,
                            // we're dealing with a Model not a View
                            // Get the position
                            model->removeRows(ui->listView->currentIndex().row(),1);
                    }
                    
                    void MainWindow::newSelection(const QItemSelection &selected, const QItemSelection &deselected){
                    
                        int x = 5; //Enter new Selection
                    }
                    
                    void MainWindow::on_selectItem2_clicked()
                    {
                        QItemSelection selection = ui->listView->selectionModel()->selection();
                        QModelIndex index = model->index(1, 0);
                        ui->listView->selectionModel()->clearSelection();
                        ui->listView->selectionModel()->setCurrentIndex(index, QItemSelectionModel::ClearAndSelect);
                    }
                    
                    
                    <?xml version="1.0" encoding="UTF-8"?>
                    <ui version="4.0">
                     <class>MainWindow</class>
                     <widget class="QMainWindow" name="MainWindow">
                      <property name="geometry">
                       <rect>
                        <x>0</x>
                        <y>0</y>
                        <width>661</width>
                        <height>360</height>
                       </rect>
                      </property>
                      <property name="windowTitle">
                       <string>MainWindow</string>
                      </property>
                      <widget class="QWidget" name="centralwidget">
                       <widget class="QWidget" name="">
                        <property name="geometry">
                         <rect>
                          <x>90</x>
                          <y>20</y>
                          <width>258</width>
                          <height>251</height>
                         </rect>
                        </property>
                        <layout class="QGridLayout" name="gridLayout_2">
                         <item row="0" column="0">
                          <widget class="QListView" name="listView"/>
                         </item>
                         <item row="1" column="0">
                          <layout class="QGridLayout" name="gridLayout">
                           <item row="0" column="2">
                            <widget class="QPushButton" name="delete_2">
                             <property name="text">
                              <string>Delete</string>
                             </property>
                            </widget>
                           </item>
                           <item row="2" column="0" colspan="3">
                            <widget class="QComboBox" name="comboBox"/>
                           </item>
                           <item row="0" column="1">
                            <widget class="QPushButton" name="insert">
                             <property name="text">
                              <string>Insert</string>
                             </property>
                            </widget>
                           </item>
                           <item row="0" column="0">
                            <widget class="QPushButton" name="add">
                             <property name="text">
                              <string>Add</string>
                             </property>
                            </widget>
                           </item>
                           <item row="1" column="0" colspan="3">
                            <widget class="QPushButton" name="selectItem2">
                             <property name="text">
                              <string>Select Item 2</string>
                             </property>
                            </widget>
                           </item>
                          </layout>
                         </item>
                        </layout>
                       </widget>
                      </widget>
                      <widget class="QMenuBar" name="menubar">
                       <property name="geometry">
                        <rect>
                         <x>0</x>
                         <y>0</y>
                         <width>661</width>
                         <height>21</height>
                        </rect>
                       </property>
                      </widget>
                      <widget class="QStatusBar" name="statusbar"/>
                     </widget>
                     <resources/>
                     <connections/>
                    </ui>
                    
                    

                    To test, set a breakpoint in the newSelection() slot. Run in debug mode and press "Select Item 2". Notice then, that when you "unselect" with CTRL+Click, the slot is not entered (presumably the selectionChanged() signal is not emitted).

                    1 Reply Last reply
                    0
                    • E Offline
                      E Offline
                      EaccB
                      wrote on last edited by
                      #10

                      Can someone please confirm if this is a Qt bug before I file a bug report?

                      1 Reply Last reply
                      0
                      • Christian EhrlicherC Online
                        Christian EhrlicherC Online
                        Christian Ehrlicher
                        Lifetime Qt Champion
                        wrote on last edited by Christian Ehrlicher
                        #11

                        Here are readable minimal example which is working:

                        #include <QtWidgets>
                        
                        class MainWindow : public QWidget
                        {
                        public:
                          MainWindow(QWidget *parent = nullptr);
                          void newSelection(const QItemSelection &selected, const QItemSelection &deselected);
                          void onSelectItem();
                          QListView *lv;
                        };
                        
                        MainWindow::MainWindow(QWidget *parent)
                          : QWidget(parent)
                        {
                          QVBoxLayout *lay = new QVBoxLayout(this);
                          lv = new QListView(this);
                          lay->addWidget(lv);
                          auto pb = new QPushButton("Select item 2");
                          lay->addWidget(pb);
                        
                          auto model = new QStringListModel({"Clair de Lune", "Reverie", "Prelude"}, this);
                          auto proxy = new QSortFilterProxyModel(this);
                          proxy->setSortRole(Qt::DisplayRole);
                          proxy->setDynamicSortFilter(true);
                          proxy->setSourceModel(model);
                          proxy->sort(0);
                          lv->setModel(proxy);
                        
                          // Add additional feature so that
                          // we can manually modify the data in ListView
                          // It may be triggered by hitting any key or double-click etc.
                          lv->setEditTriggers(QAbstractItemView::AnyKeyPressed |
                                              QAbstractItemView::DoubleClicked);
                          QItemSelectionModel* selectionModel = lv->selectionModel();
                          connect(selectionModel, &QItemSelectionModel::selectionChanged, this, &MainWindow::newSelection);
                        
                          connect(pb, &QPushButton::clicked, this, &MainWindow::onSelectItem);
                        }
                        
                        void MainWindow::newSelection(const QItemSelection &selected, const QItemSelection &deselected)
                        {
                          qDebug() << "selectionChanged, selected:" << selected << ", deselected:" << deselected;
                        }
                        
                        void MainWindow::onSelectItem()
                        {
                          QItemSelection selection = lv->selectionModel()->selection();
                          QModelIndex index = lv->model()->index(1, 0);
                          lv->selectionModel()->clearSelection();
                          lv->selectionModel()->setCurrentIndex(index, QItemSelectionModel::ClearAndSelect);
                        }
                        
                        int main(int argc, char **argv)
                        {
                          QApplication app(argc, argv);
                        
                          MainWindow mw;
                          mw.show();
                          return app.exec();
                        }
                        
                        

                        You use the wrong model in your MainWindow::on_selectItem2_clicked() slot.

                        Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
                        Visit the Qt Academy at https://academy.qt.io/catalog

                        1 Reply Last reply
                        3

                        • Login

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