На главную Наши проекты:
Журнал   ·   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
    Еще бы mainwindow.ui, без него как-то тоскливо ;)
      Цитата vlad2 @
      Majestio, спасибо. Если бы начинал программировать, то, наверное, воспользовался советом. Но мой стаж уже не 10 лет и даже не 20).
      Сейчас же меня интересует ответ на вопрос, поставленный в первом посте.

      В общем, не дождался я UI-файла, накидал тебе работающий проект. По идее, все как тебе нужно. По твоему коду, невзирая на твой громадный стаж программирования, могу сказать одно - учиться никогда не поздно. Особенно если громадный стаж не касается какого-то нового для тебя инструментария. Если более конкретно - не забывай, что фрэймворк Qt построен по принципу MVC. Не нужно загонять данные в представление, представление его должно само извлекать из модели. Представь, что у тебя таблица со стопицот миллионов записей. Во время отображения, скроллинга, перерисовки QTableWidget/QTableView сам запросит нужную порцию данных. А вот как и откуда получит эти данные модель - это уже её зона ответственности.

      В присоединенном примере я это тебе реализовал. Там данные хранятся в переменной типа QVector<QVector<QString>>, при изменении - тудаже и записываются. Кнопочка [Dump] на форме в лог пишет текущее содержимое этой переменной. Ну а по самому интерфейсу все упрощенно:
      • Двойной клик на ячейке включает режим ее редактирования
      • Если во время редактирования нажать ESC, произойдет выход из режима редактирования и возврат исходного содержимого
      • Если во время редактирования нажать Enter или кликнуть на другую ячейку, то произойдет выход из режима редактирования и новые данные сохранятся
      • Про кнопку Dump уже писал выше
      Проект собирал под Qt 5.15.13 и Qt 6.7.0 - везде полёт нормальный. В общем, качай и разбирайся, может чего и пригодится.

      Прикреплённый файлПрикреплённый файлTestEditWidget.src.7z (2,93 Кбайт, скачиваний: 10)

      P.S. Небольшое дополнение. Присоединенный пример - конечно не эталон. Там упущена одна важная деталь - разорвана "связь" между хранилищем данных (переменной) и моделью. По фэн-шую хранилище данных нужно обернуть классом, сделать ему геттеры и сеттеры, а также связать сигналами & слотами его с моделью. Тогда при любом изменении данных в хранилище - изменения автоматом улетят в модель, а оттуда уже в представление.
        Цитата Majestio @
        Еще бы mainwindow.ui
        Добавил.
        Цитата Majestio @
        В общем, не дождался я UI-файла, накидал тебе работающий проект
        Извини, был в отъезде. Спасибо за проект, будет полезен для изучения. В твоём примере нет перехода от SelectItems к SelectRows, о чём , собственно и был мой первый вопрос: как сделать, чтобы строка выделялась сразу после того, как в ходе выполнения кода встречается setSelectionBehavior(QAbstractItemView::SelectRows) или что-то надо ещё добавить. Если не менять выделение строки, то редактируемая строка выглядит примерно так, как в твоём примере, только остаётся выделенной, а не серой, как в примере (см. картинку). Видимо, в твоём примере фокус переходит на editor, а у меня - нет.
        Что касается данных для таблицы, то в реальных таблицах они разных типов и берутся из двоичных файлов, поэтому в качестве хранения использую контейнеры структур типа QList<...>. Твой пример пригодится для организации редактирования с откатами и подтверждениями. Ну и для понимания структуры программ в Qt.
        Прикреплённый файлПрикреплённый файлmainwindow.ui (6,63 Кбайт, скачиваний: 8)
        Прикреплённая картинка
        Прикреплённая картинка
        Сообщение отредактировано: vlad2 -
          Цитата vlad2 @
          В твоём примере нет перехода от SelectItems к SelectRows, о чём , собственно и был мой первый вопрос: как сделать, чтобы строка выделялась сразу после того, как в ходе выполнения кода встречается setSelectionBehavior(QAbstractItemView::SelectRows) или что-то надо ещё добавить. Если не менять выделение строки, то редактируемая строка выглядит примерно так, как в твоём примере, только остаётся выделенной, а не серой, как в примере (см. картинку). Видимо, в твоём примере фокус переходит на editor, а у меня - нет.

          Да, когда я делал свой пример, у меня была одна цель - продемонстрировать правильный вход и выход из режима редактирования. Чтобы не было необходимости дополнительного клика на таблице, как ты писал в ранних сообщениях. Однако, хочу заметить, ты хочешь несколько видоизменить функционал интерфейса. Но по стандартам проектирования GUI фокусом может обладать только один элемент! А ты пытаешься сделать фокусом и строку, и редактируемую ячейку. Твой подход в данном случае будет неправильным. Предлагаю не ломать стандартную логику фокусного выделения, а просто перекрасить то, что не устраивает - в моем случае "серое" выделение. Решение этого несложное, добавим немножко кода.

          В файле ItemEditDelegate.h добавим перекрытие метода initStyleOption, теперь серый цвет будет заменен синим:

          ExpandedWrap disabled
            #ifndef ITEMEDITDELEGATE_H
            #define ITEMEDITDELEGATE_H
             
            #include <QStyledItemDelegate>
             
            class ItemEditDelegate : public QStyledItemDelegate {
                    Q_OBJECT
             
                public:
                    explicit ItemEditDelegate(QObject *parent = nullptr);
                    QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem& option, const QModelIndex& index) const override;
                    void initStyleOption(QStyleOptionViewItem *option, const QModelIndex& index) const override {
                        QStyledItemDelegate::initStyleOption(option, index);
                        if (option->state & QStyle::State_Selected) {
                            option->palette.setColor(QPalette::HighlightedText, QColor(Qt::white));
                            option->palette.setColor(QPalette::Highlight, QColor(Qt::blue));
                        }
                    }
             
                signals:
                    void cellEditingStarted(const QModelIndex& index) const;
                    void cellEditingFinished(const QModelIndex& index) const;
            };
             
            #endif // ITEMEDITDELEGATE_H

          Одно важное замечание - в моем дополнении "перекраска" проводится строго в синий цвет. Но народ достаточно часто меняет под себя темы оформления своего рабочего стола. И не у всех цвет выделения синий. Поэтому будет более правильно с перекрываемом методе сперва находить цвет фона и текста по системным метрикам. Конечно это платформо-зависимые шляпы, для Windows своё WinAPI, для Линукc/FreeBSD - API X11, для MacOSX - API XQuartz. В общем, если тебя этот вопрос волнует - это тебе домашнее задание :lol:
            Цитата Majestio @
            А ты пытаешься сделать фокусом и строку, и редактируемую ячейку.

            Вовсе нет). На приведенной выше картинке показано, как не надо. Видимо, плохо объяснил. На приложенной к этому посту картинке показал текущую ситуацию:
            A - допустим, редактирую 5-ю строку (здесь SelectItems);
            B - после клика по 2-й строке, неважно, в какой ячейке, редакция заканчивается и устанавливается SelectRows. Но мы видим, что, несмотря на это, строка не выделена. Чтобы строка выделилась, нужно ещё раз кликнуть по этой строке;
            C - такую картинку хочу получить сразу после клика по 2-й строке.
            Сообщение отредактировано: vlad2 -

            Прикреплённая картинка
            Прикреплённая картинка
              Ну ок, спорить нет желания :lol: См. мою последнюю правку - по идее то, что ты хотел бы видеть.
                Цитата Majestio @
                См. мою последнюю правку - по идее то, что ты хотел бы видеть.
                Хотел я А + С из предыдущего поста. Если это похоже на твой пример с правкой, то ок, тоже не люблю спорить).
                В любом случае - спасибо за помощь.
                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                0 пользователей:


                Рейтинг@Mail.ru
                [ Script execution time: 0,0392 ]   [ 23 queries used ]   [ Generated: 25.06.24, 08:04 GMT ]