Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Danila_Bagrofff от Август 03, 2011, 17:59



Название: QTableView: doubleClicked и clicked
Отправлено: 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 не помогают. Изменение в винде скорости обработки двойоного нажатия тоже.

Как реализовать?


Название: Re: QTableView: doubleClicked и clicked
Отправлено: Пантер от Август 03, 2011, 19:57
clicked 2 раза приходит?


Название: Re: QTableView: doubleClicked и clicked
Отправлено: Danila_Bagrofff от Август 04, 2011, 09:17
да, каждое нажатие - clicked.

Как бы побороть....


Название: Re: QTableView: doubleClicked и clicked
Отправлено: Пантер от Август 04, 2011, 09:22
В слоте введи переменную на количество кликов и промежуток между ними.


Название: Re: QTableView: doubleClicked и clicked
Отправлено: climber от Август 04, 2011, 09:45
А как насчет использования Event'ов? Переопредилите virtual void mouseDoubleClickEvent ( QMouseEvent * event ), должно работать.


Название: Re: QTableView: doubleClicked и clicked
Отправлено: Danila_Bagrofff от Август 04, 2011, 12:34
А как насчет использования Event'ов? Переопредилите virtual void mouseDoubleClickEvent ( QMouseEvent * event ), должно работать.

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

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


Название: Re: QTableView: doubleClicked и clicked
Отправлено: Пантер от Август 04, 2011, 12:41
Первое нажатие попадает в кликед, там сохраняешь текущее время и выставляешь флаг в true. По второму кликеду проверяешь флаг и сравниваешь текущее время с сохраненным. Если флаг в true и время подходит, то вызываешь даблКликед.


Название: Re: QTableView: doubleClicked и clicked
Отправлено: GreatSnake от Август 04, 2011, 12:43
А что выдаёт QApplication::doubleClickInterval()?


Название: Re: QTableView: doubleClicked и clicked
Отправлено: climber от Август 04, 2011, 12:48
А как насчет использования Event'ов? Переопредилите virtual void mouseDoubleClickEvent ( QMouseEvent * event ), должно работать.

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

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

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

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

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


Название: Re: QTableView: doubleClicked и clicked
Отправлено: Igors от Август 04, 2011, 12:52
Первое нажатие попадает в кликед, там сохраняешь текущее время и выставляешь флаг в true. По второму кликеду проверяешь флаг и сравниваешь текущее время с сохраненным. Если флаг в true и время подходит, то вызываешь даблКликед.
Именно так и делали в Mac Classic  :) (только надо еще сравнить позиции мыши равны для обоих кликов). Конечно все будет работать, но это тяжеловато - плюс надо еще заполучить SystemDblClickTime. Хотелось бы попастись на сервисе фреймворка (законный интерес)


Название: Re: QTableView: doubleClicked и clicked
Отправлено: Пантер от Август 04, 2011, 13:19
Зачем SystemDblClickTime, если есть QApplication::doubleClickInterval()?


Название: Re: QTableView: doubleClicked и clicked
Отправлено: Danila_Bagrofff от Август 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, но это не критично.