Russian Qt Forum
Октябрь 01, 2024, 10:16 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Про заголовки выделенных колонок в QTableWidget  (Прочитано 6327 раз)
foufou
Гость
« : Август 13, 2010, 20:43 »

Пишу программку с компонентом типа QTableWidget. Возникла у меня проблема: как удалить колонку, но только в том случае, если она выделена целиком. Колонка целиком выделяется, когда юзер кликает по заголовку колонки. Тогда выделяются вся колонка вместе с ее заголовком. Хорошо бы получить список выделенных заголовков (или их индексов), чтобы поудалять выделенные таким образом колонки. Хотел бы спросить общественность: можно ли такое сделать ?

Можно конечно сделать тупо: усовершенствовать код, приведенный ниже тем, что еще и пересчитывать выделенные ячейки в текущей колонке. Если количество выделенных ячеек в колонке равно числу всех ячеек в колонке, то удалить колонку. 

QList<QTableWidgetSelectionRange> ranges = tableTable->selectedRanges(); // здесь tableTable - объект QTableWidget       
if (!ranges.isEmpty())
    {               
         int index = ranges.first().leftColumn();
         for (int i = 0; i < ranges.first().columnCount(); i++)
         {
              tableTable->removeColumn(index);
         }
     }

Но хотелось бы сделать красиво Улыбающийся
Вообще, отслеживается ли как-то выделение заголовков таблицы, а не только ячеек ?
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #1 : Август 13, 2010, 22:59 »

на поллитра:
QTableWidgetItem * QTableWidget::{horizontal|vertical}HeaderItem ( int {column|row} ) const
bool QTableWidgetItem::isSelected () const
Записан

Юра.
foufou
Гость
« Ответ #2 : Август 14, 2010, 00:14 »

на поллитра:
QTableWidgetItem * QTableWidget::{horizontal|vertical}HeaderItem ( int {column|row} ) const
bool QTableWidgetItem::isSelected () const

Большое спасибо ! А нельзя ли привести какой-нибудь пример как это применить или написать немного поподробнее ? А то пока не получается - что-то неправильно делаю.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #3 : Август 14, 2010, 00:49 »

кол-во заголовков столбцов (horizontalHeaderItem) у тебя ограничено, перебери их все и проверь у каждого, что возвращает метод isSelected(). Это будет более быстрый путь, чем перебирать все выделенные элементы (ячейки).
Ну а тот заголовок, который выделен, тот и удалять можно. Но не сразу (в цикле), а после цикла проверки, запоминай указатели заголовков, которые выделены. Иначе, удалив столбец, их число изменятся.
Записан

Юра.
foufou
Гость
« Ответ #4 : Август 14, 2010, 01:18 »

кол-во заголовков столбцов (horizontalHeaderItem) у тебя ограничено, перебери их все и проверь у каждого, что возвращает метод isSelected(). Это будет более быстрый путь, чем перебирать все выделенные элементы (ячейки).
Ну а тот заголовок, который выделен, тот и удалять можно. Но не сразу (в цикле), а после цикла проверки, запоминай указатели заголовков, которые выделены. Иначе, удалив столбец, их число изменятся.

Пытаюсь делать вот так:

for (int i = tableTable->columnCount()-1; i >= 0; --i) // здесь tableTable - объект QTableWidget
            {
                QTableWidgetItem *head = tableTable->horizontalHeaderItem(i);
                if (head->isSelected())
                {
                    tableTable->removeColumn(i);
                }
            }

Т.е. перебираю заголовки колонок, начиная от самых крайних справа. Если заголовок выделен, то удалить колонку с тем же номером, что и у заголовка. Но приведенный код не работает. Пошаговая отладка показывает, что блок после оператора if никогда не выполняется, т.е. якобы ни один заголовок не выделен.   Непонимающий
Полагаю, что ошибка во второй строчке, где определяется head - наверное так нельзя.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #5 : Август 14, 2010, 02:13 »

яж написал:
"Но не сразу (в цикле), а после цикла проверки"

П.С.
в цикле for обычно топают от начала к концу
Записан

Юра.
foufou
Гость
« Ответ #6 : Август 14, 2010, 10:18 »

яж написал:
"Но не сразу (в цикле), а после цикла проверки"

П.С.
в цикле for обычно топают от начала к концу

Спасибо за ответ. Попробовал так, как вы предлагаете, но проблема осталась. Сделал вот так:

QList<QTableWidgetItem*> headList;
            for (int i = 0; i < tableTable->columnCount(); i++)
            {
                QTableWidgetItem *head = tableTable->horizontalHeaderItem(i);
                if (head->isSelected())
                    headList.append(head);
            }

Здесь должен был составляться список выделенных заголовков. Однако по-прежнему не выполняется то, что стоит за оператором if по условию true, т.е. head->isSelected() якобы всегда false, что непонятно.
Записан
foufou
Гость
« Ответ #7 : Август 15, 2010, 15:10 »

Короче пока оживить isSelected() так, чтобы она видела выделенные заголовки, не удается. Подскажите, плиз, какие-нибудь идеи !  В замешательстве
Записан
Anarion
Гость
« Ответ #8 : Август 16, 2010, 23:27 »

Попробуй так:

Код:
for (i=0; i<tableTable->columnCount(); i++)
    qDebug() << tableTable->horizontalHeader()->selectionModel()->isColumnSelected(i,QModelIndex());
Записан
foufou
Гость
« Ответ #9 : Август 27, 2010, 21:26 »

Большое спасибо ! Вот это работает !  Смеющийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.101 секунд. Запросов: 23.