Russian Qt Forum

Qt => Вопросы новичков => Тема начата: virtual_root от Май 14, 2012, 09:18



Название: Scroll по QTableWidget движением указателя мыши
Отправлено: virtual_root от Май 14, 2012, 09:18
Доброе утро! Ребята, у меня возникла такая задача: пролистывать записи в  таблице не колёсеком мыши, а как на сенсорных телефонах движением указателя мыши. Кто-нибудь подобное реализовывал? 
У меня собственно только один вопрос: как поймать верхние и нижние границы таблицы при попадании указателя на них?
Мне в голову пришло пока только по координатам отловить, но может есть какой-то более удобный метод?


Название: Re: Scroll по QTableWidget движением указателя мыши
Отправлено: Bepec от Май 14, 2012, 09:23
Если ты хочешь делать рамками(верхня/нижняя), тогда по координатам.


Название: Re: Scroll по QTableWidget движением указателя мыши
Отправлено: virtual_root от Май 14, 2012, 09:32
У меня возник ещё один вопрос. Я использую событие
Код:
void Payment::underMouse(){

}
Чтобы поймать указатель когда его наведут на таблицу. А как  мне получить информацию о координатах указателя... Как узнать координаты, куда именно навел пользователь указатель?


Название: Re: Scroll по QTableWidget движением указателя мыши
Отправлено: virtual_root от Май 14, 2012, 10:30
Сделала 2 таких события:
Код:
void Payment::on_tableWidget_2_cellEntered(int row, int column)
{  qDebug()<<__FUNCTION__;
    if (m_row == row) qDebug()<<"==";
    else if (row > m_row) qDebug()<<"up";
    else qDebug()<<"down "<<row<<" m-row = "<<m_row;
}

void Payment::on_tableWidget_2_cellPressed(int row, int column)
{  m_row = row;
    qDebug()<<__FUNCTION__;
}

Осталось только программно прокрутить скролл, подскажите как это сделать?


Название: Re: Scroll по QTableWidget движением указателя мыши
Отправлено: GreatSnake от Май 14, 2012, 11:07
Код
C++ (Qt)
QTableWidget::verticalScrollBar()->setValue()


Название: Re: Scroll по QTableWidget движением указателя мыши
Отправлено: virtual_root от Май 14, 2012, 11:56
Спасибо большое! У меня всё получилось реализовала следующим образом:
Код:
void Payment::on_tableWidget_2_cellEntered(int row, int column)
{
    if (row > m_row ) ui->tableWidget_2->verticalScrollBar()->setValue(ui->tableWidget_2->verticalScrollBar()->value()-20);
    else if (row < m_row) ui->tableWidget_2->verticalScrollBar()->setValue(ui->tableWidget_2->verticalScrollBar()->value()+20);;
}

void Payment::on_tableWidget_2_cellPressed(int row, int column)
{
    m_row = row;

}

Т.е. кликаем на ячейку, запиминаем номер её строки и когда пользователь тащит указатель вверх или вниз мы в событии on_tableWidget_2_cellEntered  скролим строки.
Всё хорошо работает, но правда тогда страдает скролл по колесику мышки из-за слбытия on_tableWidget_2_cellEntered.
Может возможно как-то сохранить два способа пролистывания списка строк?


Название: Re: Scroll по QTableWidget движением указателя мыши
Отправлено: virtual_root от Май 14, 2012, 11:58
может быть можно как-то поймать в событии on_tableWidget_2_cellEntered, что пользователь сейчас пользуется колесиком или что левая кнопка мыши не зажата? Как это сделать, подскажите ребята?


Название: Re: Scroll по QTableWidget движением указателя мыши
Отправлено: virtual_root от Май 14, 2012, 12:10
Нашла как проверить зажата ли левая кнопка мыши: QApplication::mouseButtons(Qt::LeftButton);  Но у меня не получается это использовать в коде... Как эту конструкцию в if запихнуть?


Название: Re: Scroll по QTableWidget движением указателя мыши
Отправлено: Serr500 от Май 14, 2012, 12:14
Эту - никак, поскольку там ошибка.

Код:
if (QApplication::mouseButtons().testFlag(Qt::LeftButton)) {
    // . . .
}


Название: Re: Scroll по QTableWidget движением указателя мыши
Отправлено: virtual_root от Май 15, 2012, 13:05
Ребята, помогите разобраться! Написала следующий код:
Код:
void Payment::on_tableWidget_2_cellEntered(int row, int column)
{
    if (QApplication::mouseButtons().testFlag(Qt::LeftButton)) { 
        if (row > m_row ) ui->tableWidget_2->verticalScrollBar()->setValue(ui->tableWidget_2->verticalScrollBar()->value()-20);
        else if (row < m_row) ui->tableWidget_2->verticalScrollBar()->setValue(ui->tableWidget_2->verticalScrollBar()->value()+20);
        ui->tableWidget_2->setCursor(Qt::ClosedHandCursor);
    }
    else ui->tableWidget_2->setCursor(Qt::ArrowCursor);
}

void Payment::on_tableWidget_2_cellPressed(int row, int column)
{
    m_row = row;
    ui->tableWidget_2->setCursor(Qt::ClosedHandCursor);

}


void Payment::on_tableWidget_cellEntered(int row, int column)
{
    if (QApplication::mouseButtons().testFlag(Qt::LeftButton)) {
        if (row > m_row ) ui->tableWidget->verticalScrollBar()->setValue(ui->tableWidget->verticalScrollBar()->value()-20);
        else if (row < m_row) ui->tableWidget->verticalScrollBar()->setValue(ui->tableWidget->verticalScrollBar()->value()+20);
        ui->tableWidget->setCursor(Qt::ClosedHandCursor);
    }
    else ui->tableWidget->setCursor(Qt::ArrowCursor);
}

void Payment::on_tableWidget_cellPressed(int row, int column)
{
    m_row = row;
    ui->tableWidget->setCursor(Qt::ClosedHandCursor);
}

void Payment::on_tableWidget_3_cellEntered(int row, int column)
{
    if (QApplication::mouseButtons().testFlag(Qt::LeftButton)) {
        if (row > m_row ) ui->tableWidget_3->verticalScrollBar()->setValue(ui->tableWidget_3->verticalScrollBar()->value()-20);
        else if (row < m_row) ui->tableWidget_3->verticalScrollBar()->setValue(ui->tableWidget_3->verticalScrollBar()->value()+20);
        ui->tableWidget_3->setCursor(Qt::ClosedHandCursor);
    }
    else ui->tableWidget_3->setCursor(Qt::ArrowCursor);
}

void Payment::on_tableWidget_3_cellPressed(int row, int column)
{
    m_row = row;
    ui->tableWidget_3->setCursor(Qt::ClosedHandCursor);
}

Не могу понять почему для tableWidget_2 методы коректно работают(т.е. зажимаю левую кнопку мыши тящу вниз/вверх срабатывает скролл), а для других tableWidget не работает и вообще когда я пытаюсь сделать теже самые действия приложения падает. Кто-нибудь может объяснить почему???
Поддержка mouseTracking включена у всех таблиц.


Название: Re: Scroll по QTableWidget движением указателя мыши
Отправлено: virtual_root от Май 15, 2012, 13:46
Уже разобралась.