На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела *nix / gcc / Eclipse / Qt / wxWidgets / GTK+
  • При создании темы ОБЯЗАТЕЛЬНО указывайте версию тулкита / библиотеки / компилятора.
  • Перед тем как задать вопрос, сформулируйте его правильно, чтобы вас могли понять.
  • Нарушение Правил может повлечь наказание со стороны модераторов.


Полезные ссылки:
user posted image Boost по-русски
user posted image Qt по-русски
Модераторы: archimed7592
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> QTableWidget: как перейти от выделения ячейки к выделению строки? , Win7, Qt Creator 5.0.2
    Есть таблица QTableWidget, в которой изначально поставлено выделение строк: QAbstractItemView::SelectRows.
    Есть кнопка по которой, по которой редактирую содержимое ячеек текущей строки, устанавливая QAbstractItemView::SelectItems.
    После редакции перехожу на другую строку таблицы и хочу чтобы при этом выделение сразу вернулось к SelectRows. Но сразу этого не получается, нужно дополнительно кликнуть по таблице ещё раз.
    Как сделать, чтобы сразу?
    ExpandedWrap disabled
      void MainWindow::on_btnEdit_clicked()
      {
          ui->tabW->clearSelection();
          ui->table->editItem(ui->table->item(ui->table->currentRow(), 1));
      //    ui->table->setSelectionMode(QAbstractItemView::SingleSelection);   // ничего не даёт
          ui->table->setSelectionBehavior(QAbstractItemView::SelectItems);
      }
       
      ...
       
      void MainWindow::on_table_currentCellChanged(int curRow, int curCol, int prevRow, int prevCol)
      {
       
          if (curRow != prevRow)
          {
      //        ui->table->clearSelection();
              ui->table->setEditTriggers( QAbstractItemView::NoEditTriggers );
      //        ui->table->setSelectionMode(QAbstractItemView::MultiSelection);
              ui->table->setSelectionBehavior(QAbstractItemView::SelectRows);
      //        ui->table->setRangeSelected(QTableWidgetSelectionRange(curRow, 0, curRow, ui->table->columnCount()-1), true);  // ничего не даёт
      }
      Привет, бро!

      Твоим вопросом пока не занимаюсь, но хочу дать тебе парочку советов. Которые как армейский Устав, "писаны кровью" (читай - временем на разборки):

      1. Прямо сейчас забудь про компоненты Qt, которые заканчиваются на *Widget. Вместо них пользуй *View. В твоем случае это QTableView - они более конфигурабельны. Виджеты - они для студентов, домохозяек и homeless людей.
      2. Если беда с кликами или клавой - она не беда, просто реализуй соответствующие обработчики, и смотри уже в них что и когда происходит
        Цитата Majestio @
        Вместо них пользуй *View.
        Т.е. не пользоваться дизайнером? Но это упрощает работу, тем более, если использовать свой класс на базе QTableWidget.
          Цитата vlad2 @
          Т.е. не пользоваться дизайнером?

          Забудь про дизайнер!!! Это - зло. Все контролы и их размещение нужно делать руками, вот это - по фэншую!
            Цитата vlad2 @
            Но это упрощает работу

            Оно упрощает работу ... на первый взгляд, когда ты создаешь "тупые и статические" формы. Но, как-только ты решишь разнообразить свой интерфейс - ты получишь кучу гемора от декларативных объявлений. Я тебе не советую "с потолка", я сам к этому пришел путем проб и ошибок. Программно создавать интерфейс на первый взгляд сложно. Но потом, когда это уже будет твоей практикой, я тебя уверяю - ты программно напишешь интерфейс кодом гораздо быстрее гвно-кликов в UI-дизайнере. Но у тебя есть варик - "пройди мой путь", если просто не доверяешь. Как говорят: "нет преграды патриотам" :lol:
              Majestio, спасибо. Если бы начинал программировать, то, наверное, воспользовался советом. Но мой стаж уже не 10 лет и даже не 20).
              Сейчас же меня интересует ответ на вопрос, поставленный в первом посте.
                Цитата vlad2 @
                Сейчас же меня интересует ответ на вопрос, поставленный в первом посте.

                Без синтетического примера сложно дать на 100% правильный ответ. Проверь вот такую связку в on_table_currentCellChanged:

                ExpandedWrap disabled
                  ui->table->clearSelection();
                  ui->table->selectRow(curRow);

                И еще, я думаю, что проверка if (curRow != prevRow) лишняя. Представь, ты редактируешь ячейку в строке, потом просто кликаешь на соседнюю ячейку этой же строки. По идее должно отработать ровно так же если бы ты кликал на ячейку другой строки?
                  Цитата Majestio @
                  Проверь вот такую связку
                  Проверял - до того, как написать и сейчас - не работает.
                  Т.е. мне надо, чтобы при редакции строки выделялась лишь текущая ячейка, а не вся строка, поэтому перед редакцией устанавливаю опцию QAbstractItemView::SelectItems. Но как только перехожу на другую строку, возможность редактирования пропадает (это работает) и сразу выделяется строка - устанавливаю опцию QAbstractItemView::SelectRows (для этого мне и нужна проверка if (curRow != prevRow)
                  Получается же, что при переходе на другую строку, остаётся выделенной только ячейка, куда кликнул, а чтобы выделилась строка, нужно дополнительно кликнуть ещё раз - куда угодно. Ну некрасиво).
                    Все-таки без какого-то, хотя бы минимального синтетического примера, трудно что-то говорить. Завершение редактирования обычно отлавливают двумя сигналами:

                    ExpandedWrap disabled
                      // Пример использования сигнала itemChanged
                      connect(tableWidget, &QTableWidget::itemChanged, [=](QTableWidgetItem* item) {
                          // Обработка события завершения редактирования ячейки
                      });
                       
                      // Пример использования сигнала cellChanged
                      connect(tableWidget, &QTableWidget::cellChanged, [=](int row, int column) {
                          // Обработка события завершения редактирования ячейки
                      });

                    Но не факт, что тебе это сможет помочь, т.к. ты манипулируешь двумя разными видами выделения. В этом случае, мне почему-то кажется, что нужно "спуститься вниз по иерархии" сигналов. А именно обрабатывать "сырой" клик на таблицу. И в нем уже обрабатывать начало редактирования, завершение редактирования, очередное выделение. Т.е. всё, что автоматом реализовано в QTableWidget в плане редактирования ячеек - тебе нужно будет переписать под себя руками. А на встроенные механизмы не надеяться.

                    Я бы попробовал убедиться в этом следующим образом - код, который вызывается в on_table_currentCellChanged запускать не напрямую, а через лямбду в QTimer::singleShot, с задержкой, допустим в 3 сек. С выводом в qDebug(). И обратить внимание, как отработало, что именно происходило, не было ли такого, что код отработал, а потом остальная логика QTableWidget вернула предыдущие настройки выделения.
                      Majestio, окончание редактирования я делаю сам:
                      ExpandedWrap disabled
                            void MainWindow::on_table_currentCellChanged(int curRow, int curCol, int prevRow, int prevCol)
                            {
                            
                                if (curRow != prevRow)
                                {
                                    ui->table->closePersistentEditor(ui->table->item(curRow, curCol));
                                    ui->table->clearSelection();
                                    ui->table->setEditTriggers( QAbstractItemView::NoEditTriggers );
                                    ui->table->setSelectionBehavior(QAbstractItemView::SelectRows);
                                }
                            }
                      И здесь SelectRows восстанавливается, потому что при повторном клике, например, по той же ячейке, где нахожусь, строка сразу же принимает вид выделенной. Такое ощущение, что после setSelectionBehavior(QAbstractItemView::SelectRows) нужно перерисовать строку или таблицу. Но repaint() не помогает.
                        Хорошо, а если добавить в самом конце, в блоке if:

                        ExpandedWrap disabled
                          ui->table->setSelectionMode(QAbstractItemView::SingleSelection);
                          ui->table->selectRow(curRow);

                        Что-то изменится?
                          Цитата Majestio @
                          Что-то изменится?
                          Нет. Я и раньше проделывал все эти танцы с бубном, и сейчас попробовал.
                            Цитата vlad2 @
                            Нет. Я и раньше проделывал все эти танцы с бубном, и сейчас попробовал.

                            Можешь скинуть свой код, ну или его чаcть, где это работает (вернее - не работает)?
                              Цитата Majestio @
                              Можешь скинуть свой код
                              Позже, может, к вечеру.
                                Вот рабочий тестовый пример.
                                ExpandedWrap disabled
                                  //  mainwindow.h
                                   
                                  #ifndef MAINWINDOW_H
                                  #define MAINWINDOW_H
                                   
                                  #include <QDialog>
                                  #include <QMainWindow>
                                   
                                  namespace Ui {
                                  class MainWindow;
                                  }
                                   
                                  class MainWindow : public QDialog
                                  {
                                      Q_OBJECT
                                   
                                  public:
                                      explicit MainWindow(QWidget *parent = nullptr);
                                      ~MainWindow();
                                   
                                  private slots:
                                      void on_btnEdit_clicked();
                                   
                                      void on_table_currentCellChanged(int currentRow, int currentColumn, int previousRow, int previousColumn);
                                   
                                  private:
                                      Ui::MainWindow *ui;
                                    int Mode;
                                  };
                                   
                                  #endif // MAINWINDOW_H
                                ExpandedWrap disabled
                                  //  mainwindow.cpp
                                   
                                  #include "mainwindow.h"
                                  #include "ui_mainwindow.h"
                                   
                                  MainWindow::MainWindow(QWidget *parent) :
                                      QDialog(parent),
                                      ui(new Ui::MainWindow)
                                  {
                                      ui->setupUi(this);
                                      ui->table->blockSignals(true);
                                      ui->table->setRowCount(0);
                                      ui->table->setRowCount(10);
                                   
                                      for (int k = 0; k < ui->table->rowCount(); ++k)
                                      {
                                        for (int i = 0; i < ui->table->columnCount(); ++i)
                                        {
                                          ui->table->setItem(k, i, new QTableWidgetItem(QString::number(((k + i) * (k - i)) / 0.27)));
                                        }
                                      }
                                      ui->table->blockSignals(false);
                                      Mode = 0;
                                  }
                                   
                                  MainWindow::~MainWindow()
                                  {
                                      delete ui;
                                  }
                                   
                                  void MainWindow::on_btnEdit_clicked()
                                  {
                                      ui->table->clearSelection();
                                      ui->table->setEditTriggers( QAbstractItemView::AllEditTriggers);
                                      ui->table->editItem(ui->table->item(ui->table->currentRow(), 1));
                                  //    ui->table->setSelectionMode(QAbstractItemView::SingleSelection);
                                      ui->table->setSelectionBehavior(QAbstractItemView::SelectItems);
                                      Mode = 1;
                                  }
                                  void MainWindow::on_table_currentCellChanged(int curRow, int curCol, int prevRow, int prevCol)
                                  {
                                      if (Mode && curRow != prevRow)
                                      {
                                          ui->table->blockSignals(true);
                                          ui->table->closePersistentEditor(ui->table->item(curRow, curCol));
                                          ui->table->setEditTriggers( QAbstractItemView::NoEditTriggers );
                                   
                                  //        ui->table->setSelectionMode(QAbstractItemView::MultiSelection);
                                          ui->table->setSelectionBehavior(QAbstractItemView::SelectRows);
                                          ui->table->selectRow(curRow);
                                   
                                  //        ui->table->setRangeSelected( QTableWidgetSelectionRange(ui->table->currentRow(), 0, ui->table->currentRow(), ui->table->columnCount()-1), true);
                                          Mode = 0;
                                          ui->table->blockSignals(false);
                                      }
                                  }
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0407 ]   [ 15 queries used ]   [ Generated: 18.05.24, 06:28 GMT ]