Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Hellenna от Декабря 19, 2005, 17:58



Название: [Qt 3.3]QTable: снять выделение со строки
Отправлено: 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), если выделена то тем более. Таким образом, не представляется возможным в обработчике сигнала понять кликали на выделенную ячейку или нет...


Название: QTable: снять выделение со строки
Отправлено: Hellenna от Декабря 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();
}