![>](style_images/1/nav_m.gif)
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.188.22.14] |
![]() |
|
Страницы: (2) 1 [2] все ( Перейти к последнему сообщению ) |
Сообщ.
#16
,
|
|
|
Еще бы mainwindow.ui, без него как-то тоскливо
![]() |
Сообщ.
#17
,
|
|
|
Цитата vlad2 @ Majestio, спасибо. Если бы начинал программировать, то, наверное, воспользовался советом. Но мой стаж уже не 10 лет и даже не 20). Сейчас же меня интересует ответ на вопрос, поставленный в первом посте. В общем, не дождался я UI-файла, накидал тебе работающий проект. По идее, все как тебе нужно. По твоему коду, невзирая на твой громадный стаж программирования, могу сказать одно - учиться никогда не поздно. Особенно если громадный стаж не касается какого-то нового для тебя инструментария. Если более конкретно - не забывай, что фрэймворк Qt построен по принципу MVC. Не нужно загонять данные в представление, представление его должно само извлекать из модели. Представь, что у тебя таблица со стопицот миллионов записей. Во время отображения, скроллинга, перерисовки QTableWidget/QTableView сам запросит нужную порцию данных. А вот как и откуда получит эти данные модель - это уже её зона ответственности. В присоединенном примере я это тебе реализовал. Там данные хранятся в переменной типа QVector<QVector<QString>>, при изменении - тудаже и записываются. Кнопочка [Dump] на форме в лог пишет текущее содержимое этой переменной. Ну а по самому интерфейсу все упрощенно: Проект собирал под Qt 5.15.13 и Qt 6.7.0 - везде полёт нормальный. В общем, качай и разбирайся, может чего и пригодится. Прикреплённый файл ![]() P.S. Небольшое дополнение. Присоединенный пример - конечно не эталон. Там упущена одна важная деталь - разорвана "связь" между хранилищем данных (переменной) и моделью. По фэн-шую хранилище данных нужно обернуть классом, сделать ему геттеры и сеттеры, а также связать сигналами & слотами его с моделью. Тогда при любом изменении данных в хранилище - изменения автоматом улетят в модель, а оттуда уже в представление. |
Сообщ.
#18
,
|
|
|
Цитата Majestio @ Добавил.Еще бы mainwindow.ui Цитата Majestio @ Извини, был в отъезде. Спасибо за проект, будет полезен для изучения. В твоём примере нет перехода от SelectItems к SelectRows, о чём , собственно и был мой первый вопрос: как сделать, чтобы строка выделялась сразу после того, как в ходе выполнения кода встречается setSelectionBehavior(QAbstractItemView::SelectRows) или что-то надо ещё добавить. Если не менять выделение строки, то редактируемая строка выглядит примерно так, как в твоём примере, только остаётся выделенной, а не серой, как в примере (см. картинку). Видимо, в твоём примере фокус переходит на editor, а у меня - нет.В общем, не дождался я UI-файла, накидал тебе работающий проект Что касается данных для таблицы, то в реальных таблицах они разных типов и берутся из двоичных файлов, поэтому в качестве хранения использую контейнеры структур типа QList<...>. Твой пример пригодится для организации редактирования с откатами и подтверждениями. Ну и для понимания структуры программ в Qt. Прикреплённый файл ![]() Прикреплённая картинка
|
Сообщ.
#19
,
|
|
|
Цитата vlad2 @ В твоём примере нет перехода от SelectItems к SelectRows, о чём , собственно и был мой первый вопрос: как сделать, чтобы строка выделялась сразу после того, как в ходе выполнения кода встречается setSelectionBehavior(QAbstractItemView::SelectRows) или что-то надо ещё добавить. Если не менять выделение строки, то редактируемая строка выглядит примерно так, как в твоём примере, только остаётся выделенной, а не серой, как в примере (см. картинку). Видимо, в твоём примере фокус переходит на editor, а у меня - нет. Да, когда я делал свой пример, у меня была одна цель - продемонстрировать правильный вход и выход из режима редактирования. Чтобы не было необходимости дополнительного клика на таблице, как ты писал в ранних сообщениях. Однако, хочу заметить, ты хочешь несколько видоизменить функционал интерфейса. Но по стандартам проектирования GUI фокусом может обладать только один элемент! А ты пытаешься сделать фокусом и строку, и редактируемую ячейку. Твой подход в данном случае будет неправильным. Предлагаю не ломать стандартную логику фокусного выделения, а просто перекрасить то, что не устраивает - в моем случае "серое" выделение. Решение этого несложное, добавим немножко кода. В файле ItemEditDelegate.h добавим перекрытие метода initStyleOption, теперь серый цвет будет заменен синим: ![]() ![]() #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. В общем, если тебя этот вопрос волнует - это тебе домашнее задание ![]() |
Сообщ.
#20
,
|
|
|
Цитата Majestio @ А ты пытаешься сделать фокусом и строку, и редактируемую ячейку. Вовсе нет). На приведенной выше картинке показано, как не надо. Видимо, плохо объяснил. На приложенной к этому посту картинке показал текущую ситуацию: A - допустим, редактирую 5-ю строку (здесь SelectItems); B - после клика по 2-й строке, неважно, в какой ячейке, редакция заканчивается и устанавливается SelectRows. Но мы видим, что, несмотря на это, строка не выделена. Чтобы строка выделилась, нужно ещё раз кликнуть по этой строке; C - такую картинку хочу получить сразу после клика по 2-й строке. Прикреплённая картинка
|
Сообщ.
#21
,
|
|
|
Ну ок, спорить нет желания
![]() |
Сообщ.
#22
,
|
|
|
Цитата Majestio @ Хотел я А + С из предыдущего поста. Если это похоже на твой пример с правкой, то ок, тоже не люблю спорить).См. мою последнюю правку - по идее то, что ты хотел бы видеть. В любом случае - спасибо за помощь. |