Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.239.87.20] |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Есть таблица QTableWidget, в которой изначально поставлено выделение строк: QAbstractItemView::SelectRows.
Есть кнопка по которой, по которой редактирую содержимое ячеек текущей строки, устанавливая QAbstractItemView::SelectItems. После редакции перехожу на другую строку таблицы и хочу чтобы при этом выделение сразу вернулось к SelectRows. Но сразу этого не получается, нужно дополнительно кликнуть по таблице ещё раз. Как сделать, чтобы сразу? 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); // ничего не даёт } |
Сообщ.
#2
,
|
|
|
Привет, бро!
Твоим вопросом пока не занимаюсь, но хочу дать тебе парочку советов. Которые как армейский Устав, "писаны кровью" (читай - временем на разборки): |
Сообщ.
#3
,
|
|
|
Цитата Majestio @ Т.е. не пользоваться дизайнером? Но это упрощает работу, тем более, если использовать свой класс на базе QTableWidget. Вместо них пользуй *View. |
Сообщ.
#4
,
|
|
|
Цитата vlad2 @ Т.е. не пользоваться дизайнером? Забудь про дизайнер!!! Это - зло. Все контролы и их размещение нужно делать руками, вот это - по фэншую! |
Сообщ.
#5
,
|
|
|
Цитата vlad2 @ Но это упрощает работу Оно упрощает работу ... на первый взгляд, когда ты создаешь "тупые и статические" формы. Но, как-только ты решишь разнообразить свой интерфейс - ты получишь кучу гемора от декларативных объявлений. Я тебе не советую "с потолка", я сам к этому пришел путем проб и ошибок. Программно создавать интерфейс на первый взгляд сложно. Но потом, когда это уже будет твоей практикой, я тебя уверяю - ты программно напишешь интерфейс кодом гораздо быстрее |
Сообщ.
#6
,
|
|
|
Majestio, спасибо. Если бы начинал программировать, то, наверное, воспользовался советом. Но мой стаж уже не 10 лет и даже не 20).
Сейчас же меня интересует ответ на вопрос, поставленный в первом посте. |
Сообщ.
#7
,
|
|
|
Цитата vlad2 @ Сейчас же меня интересует ответ на вопрос, поставленный в первом посте. Без синтетического примера сложно дать на 100% правильный ответ. Проверь вот такую связку в on_table_currentCellChanged: ui->table->clearSelection(); ui->table->selectRow(curRow); И еще, я думаю, что проверка if (curRow != prevRow) лишняя. Представь, ты редактируешь ячейку в строке, потом просто кликаешь на соседнюю ячейку этой же строки. По идее должно отработать ровно так же если бы ты кликал на ячейку другой строки? |
Сообщ.
#8
,
|
|
|
Цитата Majestio @ Проверял - до того, как написать и сейчас - не работает.Проверь вот такую связку Т.е. мне надо, чтобы при редакции строки выделялась лишь текущая ячейка, а не вся строка, поэтому перед редакцией устанавливаю опцию QAbstractItemView::SelectItems. Но как только перехожу на другую строку, возможность редактирования пропадает (это работает) и сразу выделяется строка - устанавливаю опцию QAbstractItemView::SelectRows (для этого мне и нужна проверка if (curRow != prevRow) Получается же, что при переходе на другую строку, остаётся выделенной только ячейка, куда кликнул, а чтобы выделилась строка, нужно дополнительно кликнуть ещё раз - куда угодно. Ну некрасиво). |
Сообщ.
#9
,
|
|
|
Все-таки без какого-то, хотя бы минимального синтетического примера, трудно что-то говорить. Завершение редактирования обычно отлавливают двумя сигналами:
// Пример использования сигнала 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 вернула предыдущие настройки выделения. |
Сообщ.
#10
,
|
|
|
Majestio, окончание редактирования я делаю сам:
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); } } |
Сообщ.
#11
,
|
|
|
Хорошо, а если добавить в самом конце, в блоке if:
ui->table->setSelectionMode(QAbstractItemView::SingleSelection); ui->table->selectRow(curRow); Что-то изменится? |
Сообщ.
#12
,
|
|
|
Цитата Majestio @ Нет. Я и раньше проделывал все эти танцы с бубном, и сейчас попробовал. Что-то изменится? |
Сообщ.
#13
,
|
|
|
Цитата vlad2 @ Нет. Я и раньше проделывал все эти танцы с бубном, и сейчас попробовал. Можешь скинуть свой код, ну или его чаcть, где это работает (вернее - не работает)? |
Сообщ.
#14
,
|
|
|
Цитата Majestio @ Позже, может, к вечеру. Можешь скинуть свой код |
Сообщ.
#15
,
|
|
|
Вот рабочий тестовый пример.
// 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 // 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); } } |