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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Scroll по QTableWidget движением указателя мыши  (Прочитано 5635 раз)
virtual_root
Гость
« : Май 14, 2012, 09:18 »

Доброе утро! Ребята, у меня возникла такая задача: пролистывать записи в  таблице не колёсеком мыши, а как на сенсорных телефонах движением указателя мыши. Кто-нибудь подобное реализовывал? 
У меня собственно только один вопрос: как поймать верхние и нижние границы таблицы при попадании указателя на них?
Мне в голову пришло пока только по координатам отловить, но может есть какой-то более удобный метод?
Записан
Bepec
Гость
« Ответ #1 : Май 14, 2012, 09:23 »

Если ты хочешь делать рамками(верхня/нижняя), тогда по координатам.
Записан
virtual_root
Гость
« Ответ #2 : Май 14, 2012, 09:32 »

У меня возник ещё один вопрос. Я использую событие
Код:
void Payment::underMouse(){

}
Чтобы поймать указатель когда его наведут на таблицу. А как  мне получить информацию о координатах указателя... Как узнать координаты, куда именно навел пользователь указатель?
« Последнее редактирование: Май 14, 2012, 09:40 от virtual_root » Записан
virtual_root
Гость
« Ответ #3 : Май 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__;
}

Осталось только программно прокрутить скролл, подскажите как это сделать?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #4 : Май 14, 2012, 11:07 »

Код
C++ (Qt)
QTableWidget::verticalScrollBar()->setValue()
Записан

Qt 5.11/4.8.7 (X11/Win)
virtual_root
Гость
« Ответ #5 : Май 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.
Может возможно как-то сохранить два способа пролистывания списка строк?
Записан
virtual_root
Гость
« Ответ #6 : Май 14, 2012, 11:58 »

может быть можно как-то поймать в событии on_tableWidget_2_cellEntered, что пользователь сейчас пользуется колесиком или что левая кнопка мыши не зажата? Как это сделать, подскажите ребята?
Записан
virtual_root
Гость
« Ответ #7 : Май 14, 2012, 12:10 »

Нашла как проверить зажата ли левая кнопка мыши: QApplication::mouseButtons(Qt::LeftButton);  Но у меня не получается это использовать в коде... Как эту конструкцию в if запихнуть?
Записан
Serr500
Гость
« Ответ #8 : Май 14, 2012, 12:14 »

Эту - никак, поскольку там ошибка.

Код:
if (QApplication::mouseButtons().testFlag(Qt::LeftButton)) {
    // . . .
}
Записан
virtual_root
Гость
« Ответ #9 : Май 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 включена у всех таблиц.
Записан
virtual_root
Гость
« Ответ #10 : Май 15, 2012, 13:46 »

Уже разобралась.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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