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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [Qt 3.3]QTable: снять выделение со строки  (Прочитано 4489 раз)
Hellenna
Гость
« : Декабрь 19, 2005, 17:58 »

День добрый.
Qt 3.3.
Есть QTable для которой setSelectionMode(QTable::MultiRow). Соответственно, выделение нескольких строк происходит при нажатой клавише Ctrl.  
А вот как сделать так чтобы при повторном нажатии мышью при зажатой Ctrl на уже выделенной строку выделение с нее снималось?

Пробовала ловить сигнал QTable::clicked ( int row, int col, int button, const QPoint & mousePos )  и в нем ручками играться с выделением. Hо загвоздка в том, что если строка не выделена, то при нажатии на нее она выделяется (isRowSelected() возвращает true), если выделена то тем более. Таким образом, не представляется возможным в обработчике сигнала понять кликали на выделенную ячейку или нет...
« Последнее редактирование: Январь 06, 2008, 12:15 от Вячеслав » Записан
Hellenna
Гость
« Ответ #1 : Декабрь 22, 2005, 11:08 »

Решение было найдено с помощью использования глобавльного массива в  котором хранится информация о выделении в таблице.
Если кому-то интересно, вот не притендующий на оптимальность код:
Код:

QMap<int, bool> selection;
int key;
void MainForm::loadSelection(){
    tableContents->clearSelection();
    for(uint i=0; i<tableContents->numRows(); i++){
       if(selection[i]==true) {
            tableContents->selectRow(i);
       }
   }

}

void MainForm::rememberSelection(){
    selection.clear();
    for(uint i=0; i<tableContents->numRows(); i++){
        selection.replace(i, tableContents->isRowSelected(i));

    }
}

void MainForm::tableContents_pressed(int row,int col,int button,const QPoint& pos){
 if(key==Qt::Key_Control){
        if(*selection.find(row)==true)
        {  
            selection.replace(row, false);
            loadSelection();
        }
        else{
            rememberSelection();
        }
    }
}


void MainForm::keyPressEvent( QKeyEvent * event)
{
   key=event->key();
}

void MainForm::keyReleaseEvent( QKeyEvent * event)
{
    key=0;
    rememberSelection();

}
void MainForm::tableContents_selectionChanged()
{
    if(key!=Qt::Key_Control)
        rememberSelection();
}
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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