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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTableView: doubleClicked и clicked  (Прочитано 9427 раз)
Danila_Bagrofff
Гость
« : Август 03, 2011, 17:59 »

Задача в таблице на одинарное нажатие задать одно действие, на двойное другое.

Делаем:
Код:
connect(qTblVwSearchDocs, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(searchDocEnter(QModelIndex)));
connect(qTblVwSearchDocs, SIGNAL(clicked(QModelIndex)), this, SLOT(checkDoc(QModelIndex)));

В итоге двойное нажатие игнорируется. Как заставить отдельно отрабатывать каждое из событий?

ПС. pressed, activated, entered не помогают. Изменение в винде скорости обработки двойоного нажатия тоже.

Как реализовать?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Август 03, 2011, 19:57 »

clicked 2 раза приходит?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Danila_Bagrofff
Гость
« Ответ #2 : Август 04, 2011, 09:17 »

да, каждое нажатие - clicked.

Как бы побороть....
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #3 : Август 04, 2011, 09:22 »

В слоте введи переменную на количество кликов и промежуток между ними.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
climber
Гость
« Ответ #4 : Август 04, 2011, 09:45 »

А как насчет использования Event'ов? Переопредилите virtual void mouseDoubleClickEvent ( QMouseEvent * event ), должно работать.
Записан
Danila_Bagrofff
Гость
« Ответ #5 : Август 04, 2011, 12:34 »

А как насчет использования Event'ов? Переопредилите virtual void mouseDoubleClickEvent ( QMouseEvent * event ), должно работать.

не хотелось плодить классы, и так структура зверь... а видимо придется...

В слоте введи переменную на количество кликов и промежуток между ними.
Так не поможет =) Первое е нажатие отправится в clicked. А в double не попадет.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #6 : Август 04, 2011, 12:41 »

Первое нажатие попадает в кликед, там сохраняешь текущее время и выставляешь флаг в true. По второму кликеду проверяешь флаг и сравниваешь текущее время с сохраненным. Если флаг в true и время подходит, то вызываешь даблКликед.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #7 : Август 04, 2011, 12:43 »

А что выдаёт QApplication::doubleClickInterval()?
Записан

Qt 5.11/4.8.7 (X11/Win)
climber
Гость
« Ответ #8 : Август 04, 2011, 12:48 »

А как насчет использования Event'ов? Переопредилите virtual void mouseDoubleClickEvent ( QMouseEvent * event ), должно работать.

не хотелось плодить классы, и так структура зверь... а видимо придется...

В слоте введи переменную на количество кликов и промежуток между ними.
Так не поможет =) Первое е нажатие отправится в clicked. А в double не попадет.

А у Вас QTableView не отдельным классом описан? Если отдельным то просто переопределите для него метод mouseDoubleClickEvent. Если нет, так ничего сложного не вижу в создании отдельного класса, унаследованного от QTableView. В этом классе скроете его реализацию. Такой подход наоборот немного разгрузит вашу "зверскую структуру"  Подмигивающий

Цитировать
Первое нажатие попадает в кликед, там сохраняешь текущее время и выставляешь флаг в true. По второму кликеду проверяешь флаг и сравниваешь текущее время с сохраненным. Если флаг в true и время подходит, то вызываешь даблКликед.

Больно уж на костыли смахивает. Зачем, если есть стандартный подход?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Август 04, 2011, 12:52 »

Первое нажатие попадает в кликед, там сохраняешь текущее время и выставляешь флаг в true. По второму кликеду проверяешь флаг и сравниваешь текущее время с сохраненным. Если флаг в true и время подходит, то вызываешь даблКликед.
Именно так и делали в Mac Classic  Улыбающийся (только надо еще сравнить позиции мыши равны для обоих кликов). Конечно все будет работать, но это тяжеловато - плюс надо еще заполучить SystemDblClickTime. Хотелось бы попастись на сервисе фреймворка (законный интерес)
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #10 : Август 04, 2011, 13:19 »

Зачем SystemDblClickTime, если есть QApplication::doubleClickInterval()?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Danila_Bagrofff
Гость
« Ответ #11 : Август 04, 2011, 15:27 »

В общем вот так:

Код:
#include "Widgets.h"
TableView::TableView(QWidget *parent) : QTableView(parent)
{

}

void TableView::mouseDoubleClickEvent ( QMouseEvent *event )
{
    emit(doubleClick(this->indexAt(QPoint(event->pos().x(), event->pos().y()))));
    event->accept();
}

Единственный минус, что стандартный pressed отлавливает нажатие на чек.бокс в окне QTableView, но это не критично.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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