Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: foufou от Август 13, 2010, 20:43



Название: Про заголовки выделенных колонок в QTableWidget
Отправлено: 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);
         }
     }

Но хотелось бы сделать красиво :)
Вообще, отслеживается ли как-то выделение заголовков таблицы, а не только ячеек ?


Название: Re: Про заголовки выделенных колонок в QTableWidget
Отправлено: lit-uriy от Август 13, 2010, 22:59
на поллитра:
QTableWidgetItem * QTableWidget::{horizontal|vertical}HeaderItem ( int {column|row} ) const
bool QTableWidgetItem::isSelected () const


Название: Re: Про заголовки выделенных колонок в QTableWidget
Отправлено: foufou от Август 14, 2010, 00:14
на поллитра:
QTableWidgetItem * QTableWidget::{horizontal|vertical}HeaderItem ( int {column|row} ) const
bool QTableWidgetItem::isSelected () const

Большое спасибо ! А нельзя ли привести какой-нибудь пример как это применить или написать немного поподробнее ? А то пока не получается - что-то неправильно делаю.


Название: Re: Про заголовки выделенных колонок в QTableWidget
Отправлено: lit-uriy от Август 14, 2010, 00:49
кол-во заголовков столбцов (horizontalHeaderItem) у тебя ограничено, перебери их все и проверь у каждого, что возвращает метод isSelected(). Это будет более быстрый путь, чем перебирать все выделенные элементы (ячейки).
Ну а тот заголовок, который выделен, тот и удалять можно. Но не сразу (в цикле), а после цикла проверки, запоминай указатели заголовков, которые выделены. Иначе, удалив столбец, их число изменятся.


Название: Re: Про заголовки выделенных колонок в QTableWidget
Отправлено: foufou от Август 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 - наверное так нельзя.


Название: Re: Про заголовки выделенных колонок в QTableWidget
Отправлено: lit-uriy от Август 14, 2010, 02:13
яж написал:
"Но не сразу (в цикле), а после цикла проверки"

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


Название: Re: Про заголовки выделенных колонок в QTableWidget
Отправлено: foufou от Август 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, что непонятно.


Название: Re: Про заголовки выделенных колонок в QTableWidget
Отправлено: foufou от Август 15, 2010, 15:10
Короче пока оживить isSelected() так, чтобы она видела выделенные заголовки, не удается. Подскажите, плиз, какие-нибудь идеи !  :-\


Название: Re: Про заголовки выделенных колонок в QTableWidget
Отправлено: Anarion от Август 16, 2010, 23:27
Попробуй так:

Код:
for (i=0; i<tableTable->columnCount(); i++)
    qDebug() << tableTable->horizontalHeader()->selectionModel()->isColumnSelected(i,QModelIndex());


Название: Re: Про заголовки выделенных колонок в QTableWidget
Отправлено: foufou от Август 27, 2010, 21:26
Большое спасибо ! Вот это работает !  ;D