Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Senia_Bezrubashkin от Декабрь 29, 2012, 01:01



Название: как переопределить mouseDoubleClickEvent?
Отправлено: Senia_Bezrubashkin от Декабрь 29, 2012, 01:01
Приложение состоит из двух окошек... В левом окошке - список таблиц (sqlite) и эта часть есть, в правом - выбранная двойным кликом таблица (ну, хотелось бы так) из левого окошка, получается только таблица которая параметром передается в конструктор. Все, что я понял из прочитанного, так это то, что нужно переопределить mouseDoubleClickEvent(), но как это сделать, как к этому подступиться - нет ни единой мысли. Может кто подскажет или на пример какой ссыль даст (перерыл инет, примеров не нашел подходящих... были примеры, то координаты по клику выдает, то файл открывает... все не то).
Заранее спасибо.


Название: Re: как переопределить mouseDoubleClickEvent?
Отправлено: kambala от Декабрь 29, 2012, 03:29
думаю тебе больше подойдет сигнал void QListWidget::itemDoubleClicked ( QListWidgetItem * item ) если используешь QListWidget или void QAbstractItemView::doubleClicked ( const QModelIndex & index ) если используешь модель/представление. надеюсь как связать сигнал со слотом ты знаешь.


Название: Re: как переопределить mouseDoubleClickEvent?
Отправлено: Senia_Bezrubashkin от Декабрь 31, 2012, 01:58
Слабо помогло... и походу возникли еще вопросы. Пока пытался разобраться определил пустой слот
Код:
void loadTable(const QString &tableName){}
вот так его связал с событием doubleClicked()
Код:
connect(sender, SIGNAL(doubleClicked())
        this, SLOT(loadTable(tableName)));
Вопросы такие... если я переопределил (пусть и пустым слотом) реакцию на событие, то почему приложение сохраняет прежнее поведение (по двойному клику возникает поле редактирования, по типу - переименовать файл). И второй... может я не правильно параметр  sender ставлю... хотя там выбор не велик... это были
Код:
view_1 = new QListView(this);
или
Код:
    model_1 = new QStringListModel(this);
пробовал со обоими.


Название: Re: как переопределить mouseDoubleClickEvent?
Отправлено: Senia_Bezrubashkin от Декабрь 31, 2012, 02:24
Блин... в doubleClicked() еще параметр передавать нужно (const QModelIndex & index)... и как это делать? Походу, это еще один вопрос.


Название: Re: как переопределить mouseDoubleClickEvent?
Отправлено: kambala от Декабрь 31, 2012, 04:11
надеюсь как связать сигнал со слотом ты знаешь.
похоже, я ошибся. пойди почитай про сигналы и слоты ещё.


Название: Re: как переопределить mouseDoubleClickEvent?
Отправлено: Senia_Bezrubashkin от Декабрь 31, 2012, 12:39
Почитал... все что было у Шлее (в очередной раз!). В заголовочном прописал так...
Код:
private slots:
    void loadTable(const QString &tableName);
                ...........................
private:
    void doubleClicked(const QModelIndex & index);
В .срр так...
Код:
connect(this, SIGNAL(doubleClicked(1)), this, SLOT(loadTable(tableName)));
                ............................
void MainWindow::loadTable(const QString &tableName){}

(loadTable() определил пустым). В doubleClicked(1) впихнул единицу... ну, что б что-то было (там же вроде параметр - целочисленное значение должно быть), ну, что б хотя бы заработало. И... нифига не переопределяется поведение. И как индекс передавать в doubleClicked() все равно не ясно.


Название: Re: как переопределить mouseDoubleClickEvent?
Отправлено: mutineer от Декабрь 31, 2012, 12:58
Код:
connect(this, SIGNAL(doubleClicked(1)), this, SLOT(loadTable(tableName)));
Где ты прочитал, что сигналы и слоты связываются так?

При соединении указываются типы параметров, а не значения или имена

Зачем ты в private вписал метод, который называется так же, как и сигнал? Этот код не имеет смысла и уж точно в книгах по Qt не учат так писать


Название: Re: как переопределить mouseDoubleClickEvent?
Отправлено: Senia_Bezrubashkin от Декабрь 31, 2012, 13:17
При соединении указываются типы параметров, а не значения или имена
поправил
Зачем ты в private вписал метод, который называется так же, как и сигнал?
(Макс Шлее Qt4.5 2010г. стр. 46 второй абзац.)
ага... каша из прочитанного... оказывается говорилось о сигналах которые определяешь сам (наверное).
Но... и после всех этих изменений поведение не переопределяется, и с получением индекса все равно не ясно как его получать.


Название: Re: как переопределить mouseDoubleClickEvent?
Отправлено: mutineer от Декабрь 31, 2012, 13:21
Индекс кликнутого элемента передается в твой слот через параметр сигнала. А у твоих сигнала и слота типы параметров не совпадают, соответственно соединить их и не получится. Почитай матчасть по поводу сигналов-слотов


Название: Re: как переопределить mouseDoubleClickEvent?
Отправлено: Senia_Bezrubashkin от Декабрь 31, 2012, 13:24
т. е. если соединение не происходит - сохраняется старое поведение?


Название: Re: как переопределить mouseDoubleClickEvent?
Отправлено: kambala от Декабрь 31, 2012, 13:27
старое поведение никуда не девается. просто при успешном соединении вызывается дополнительный обработчик, т.е. соединённый слот.


Название: Re: как переопределить mouseDoubleClickEvent?
Отправлено: Senia_Bezrubashkin от Декабрь 31, 2012, 13:53
Параметры сигнала и слота теперь соответствуют. Слот по-прежнему определяю пустым. Поведение не меняется, т. е. соединение не происходит. Ничего не вгоню.


Название: Re: как переопределить mouseDoubleClickEvent?
Отправлено: Bepec от Декабрь 31, 2012, 14:30
Чем больше вы кормить нас будете жалобами нас кормить без кода, ничем мы вам не поможем. А я лично начну троллить.


Название: Re: как переопределить mouseDoubleClickEvent?
Отправлено: Senia_Bezrubashkin от Декабрь 31, 2012, 14:54
Чем больше вы кормить нас будете жалобами нас кормить без кода, ничем мы вам не поможем. А я лично начну троллить.
Код:
connect(this, SIGNAL(doubleClicked(const QModelIndex &)),
        this, SLOT(loadTable(const QModelIndex &)));
void MainWindow::loadTable(const QModelIndex & tableIndex){}

и в хедере
Код:
private slots:
    void loadTable(const QModelIndex & tableIndex);
Это все, что изменилось... остальной код такой же, как описано выше.


Название: Re: как переопределить mouseDoubleClickEvent?
Отправлено: kambala от Декабрь 31, 2012, 15:38
а теперь внимательно почитай кто является источником сигнала doubleClicked() (т.е. кто его испускает), и это вовсе не this (подсказка есть в первом ответе темы)


Название: Re: как переопределить mouseDoubleClickEvent?
Отправлено: mutineer от Декабрь 31, 2012, 15:39
А что ты ожидал вообще? Ты объявил новую пустую реакцию на сигнал. Старые реакции никуда не делись (как тебе выше уже написали). Что измениться должно было?


Название: Re: как переопределить mouseDoubleClickEvent?
Отправлено: Senia_Bezrubashkin от Декабрь 31, 2012, 16:07
Ну, я рассчитывал, что старая реакция, как минимум, поломается (и этим убедиться, что соединение состоялось). А по поводу сигналов прочитал, что они высылаются из классов, которые их содержат, а сендер - указатель на объект, высылающий сигнал, вот и решил, что это this, т. к. у меня все находится в одном классе (именно по-этому я в хедере объявлял doubleClicked(), думал таким образом я его переопределяю (ошибся, что сделал это в private секции (также прочитал, что сигнал определять не надо, достаточно объявить))). Вообщем, подзапутался окончательно.


Название: Re: как переопределить mouseDoubleClickEvent?
Отправлено: mutineer от Декабрь 31, 2012, 16:28
Старая реакция никуда не денется


Название: Re: как переопределить mouseDoubleClickEvent?
Отправлено: kambala от Декабрь 31, 2012, 17:51
отправителем сигнала в твоём случае является твой QListView.

если тебе нужно, чтобы вью не редактировался при двойном клике, то просто отключи редактирование через setEditTriggers()


Название: Re: как переопределить mouseDoubleClickEvent?
Отправлено: Igors от Декабрь 31, 2012, 18:42
Ну, я рассчитывал, что старая реакция, как минимум, поломается (и этим убедиться, что соединение состоялось). А по поводу сигналов прочитал, что они высылаются из классов, которые их содержат, а сендер - указатель на объект, высылающий сигнал, вот и решил, что это this, т. к. у меня все находится в одном классе (именно по-этому я в хедере объявлял doubleClicked(), думал таким образом я его переопределяю (ошибся, что сделал это в private секции (также прочитал, что сигнал определять не надо, достаточно объявить))). Вообщем, подзапутался окончательно.
Видимо Вы полагали что сигналы - это что-то типа virtual механизма, но это не так. Не беда, разберетесь.
Лично я не считаю систему слот-сигнал шедевром инженерной мысли, но знать ее в любом случае надо


Название: Re: как переопределить mouseDoubleClickEvent?
Отправлено: Senia_Bezrubashkin от Декабрь 31, 2012, 19:11
отправителем сигнала в твоём случае является твой QListView.

если тебе нужно, чтобы вью не редактировался при двойном клике, то просто отключи редактирование через setEditTriggers()
В QListView не нашел такого метода, но не суть... и еще... получается, если не отключать редактирование, даже если мой код заработает, то к его действиям будет примешиваться и старое поведение (редактирование)... фигня какая-то... думаю так не должно быть.
В любом случае проверить пока не получается, по причине отсутствия рабочего кода.


Название: Re: как переопределить mouseDoubleClickEvent?
Отправлено: mutineer от Декабрь 31, 2012, 19:13
отправителем сигнала в твоём случае является твой QListView.

если тебе нужно, чтобы вью не редактировался при двойном клике, то просто отключи редактирование через setEditTriggers()
В QListView не нашел такого метода, но не суть...

Плохо искал: http://doc.qt.digia.com/4.7/qlistview-members.html


Название: Re: как переопределить mouseDoubleClickEvent?
Отправлено: Senia_Bezrubashkin от Декабрь 31, 2012, 19:23
Упс... сорри.


Название: Re: как переопределить mouseDoubleClickEvent?
Отправлено: Senia_Bezrubashkin от Январь 09, 2013, 22:29
получается, если не отключать редактирование, даже если мой код заработает, то к его действиям будет примешиваться и старое поведение (редактирование)... фигня какая-то... думаю так не должно быть.
Ну, надо же... реально так и есть.


Название: Re: как переопределить mouseDoubleClickEvent?
Отправлено: Dancing_on_water от Январь 10, 2013, 08:33
Если нужно отключить редактирование какой-то кокретной колонки или поля, то в классе, наследующимся от Qlistview надо переопределить метод flags


Название: Re: как переопределить mouseDoubleClickEvent?
Отправлено: Senia_Bezrubashkin от Январь 10, 2013, 12:06
Отключить редактирование проблем нет... (уже рассказали как). Просто для меня все это как-то не логично... ну, да бог с ним, я уже двигаюсь дальше.


Название: Re: как переопределить mouseDoubleClickEvent?
Отправлено: Senia_Bezrubashkin от Январь 20, 2013, 13:14
думаю тебе больше подойдет сигнал void QAbstractItemView::doubleClicked ( const QModelIndex & index ) если используешь модель/представление.
Сделал по этому сигналу... работает. Но поведение не совсем корректное: на даблклик правой кнопкой реагирует также. Видимо, все-таки нужно переопределять mouseDoubleClickEvent и выставлять условие на кнопку мыши. Или есть способ разобраться с клавишами и по QAbstractItemView::doubleClicked ()?


Название: Re: как переопределить mouseDoubleClickEvent?
Отправлено: Bepec от Январь 21, 2013, 00:02
Бгг. Читаем название слота - двойной клик мышкой. Он работает корректно :)


Название: Re: как переопределить mouseDoubleClickEvent?
Отправлено: Senia_Bezrubashkin от Январь 21, 2013, 10:31
Бгг. Читаем название слота - двойной клик мышкой. Он работает корректно :)
Какого слота? Сигнал, слот - разницу ощущаем? А двойной клик мышкой, как правой, так и левой клавишей - выдает одинаковый сигнал. Так что делай дальше бгг.  


Название: Re: как переопределить mouseDoubleClickEvent?
Отправлено: kambala от Январь 21, 2013, 16:58
смутно представляю кому может придти в голову кликать 2 раза правой кнопкой мыши или колёсиком. но в таком случае тебе только остается mouseDoubleClickEvent() и анализировать нажатую клавишу.


Название: Re: как переопределить mouseDoubleClickEvent?
Отправлено: Senia_Bezrubashkin от Январь 22, 2013, 09:58
В хидере в определении класса так:
Код:
                       .........................
protected:
    virtual void mouseDoubleClickEvent(QMouseEvent * me);

signals:
    void doubleClicked(const QModelIndex & index);
В сср'ишнике так:
Код:
view_1 = new QListView(this);
                       .........................
connect(view_1, SIGNAL(doubleClicked(const QModelIndex &)),
            this, SLOT(loadTable(const QModelIndex &)));

void MainWindow::mouseDoubleClickEvent(QMouseEvent * me)
{
    if (me->buttons() & Qt::LeftButton)
    {
        QModelIndex index(view_1->indexAt(me->pos()));
        if (index.isValid())
        {              
            qDebug()<<"Ich bin der linke Knopf.";
            emit doubleClicked(index);
        }
    }
}
И все равно реагирует на двойной клик правой клавиши. Что не так делаю та?  


Название: Re: как переопределить mouseDoubleClickEvent?
Отправлено: Senia_Bezrubashkin от Январь 22, 2013, 10:12
Или doubleClicked() это из QListView высылается, а у меня под MainWindow он заточен?


Название: Re: как переопределить mouseDoubleClickEvent?
Отправлено: Bepec от Январь 22, 2013, 10:34
У меня нет слов. Уже 2 раза писал сообщение, потом читал ваш вопрос. Быстро стирал ответ, закрывал файрфокс, выключал компьютер и залезал под одеяло.

У вас 2 разных объекта. Вы соединяете view и mainWindow. И переопределяете двойной клик mainWindow (обратите внимание).

Каким макаром переопределение в mainWindow сможет изменить view?


Название: Re: как переопределить mouseDoubleClickEvent?
Отправлено: Senia_Bezrubashkin от Январь 22, 2013, 10:44
Ну, что я могу сказать... чай с травами успокаивающими попить надо. И вообще, что так реагировать эмоционально, ну, фигню пишу бывает, ну, так раздел для новичков... понимать же надо.  ;D


Название: Re: как переопределить mouseDoubleClickEvent?
Отправлено: Bepec от Январь 22, 2013, 10:50
Та понимаю. Вы хоть что-нибудь из моего сообщения почерпнули?


Название: Re: как переопределить mouseDoubleClickEvent?
Отправлено: Senia_Bezrubashkin от Январь 22, 2013, 10:53
НУ, подозрения были, после сообщения переросло в уверенность.  ;D
P.S. Со мной на ты.


Название: Re: как переопределить mouseDoubleClickEvent?
Отправлено: Senia_Bezrubashkin от Январь 22, 2013, 11:26
блин... и в mouseDoubleClickEvent() индекс не валидный почему-то (тестовое сообщение не проходит).


Название: Re: как переопределить mouseDoubleClickEvent?
Отправлено: Bepec от Январь 22, 2013, 12:02
А я те по секрету расскажу страшную страшную тайну.

Наличие неработающего кода в сообщении позволяет раскрывать заговоры, улучшает самочувствие и заставляет твою причёску чувствовать уверенно при любой погоде.


Название: Re: как переопределить mouseDoubleClickEvent?
Отправлено: Senia_Bezrubashkin от Январь 22, 2013, 12:16
Ты с утра какую принял... синюю или красную? ;D


Название: Re: как переопределить mouseDoubleClickEvent?
Отправлено: Bepec от Январь 22, 2013, 12:59
Я всегда принимаю оранжевую - для моральной поддержки.

PS шутки шутками, а разглашённая тайна сокращает сроки ответов до минимума.


Название: Re: как переопределить mouseDoubleClickEvent?
Отправлено: carrygun от Январь 22, 2013, 13:42
блин... и в mouseDoubleClickEvent() индекс не валидный почему-то (тестовое сообщение не проходит).

Убедись что ты вообще в условие входишь.


Название: Re: как переопределить mouseDoubleClickEvent?
Отправлено: _OLEGator_ от Январь 22, 2013, 15:50
Уже дали ответ, читать надо внимательно:

У вас 2 разных объекта. Вы соединяете view и mainWindow. И переопределяете двойной клик mainWindow (обратите внимание).


Название: Re: как переопределить mouseDoubleClickEvent?
Отправлено: Senia_Bezrubashkin от Январь 22, 2013, 18:41
Убедись что ты вообще в условие входишь.
В условие входит... индекс пустой. Но не суть... поправлю


Название: Re: как переопределить mouseDoubleClickEvent?
Отправлено: Senia_Bezrubashkin от Январь 22, 2013, 18:47
Уже дали ответ, читать надо внимательно:
Пфф... умиляешь однако. А пост который над тем, что ты цитируешь не досуг прочитать? Или куда взгляд упал, то и читаем? А! Понял... тут эхо.  ;D


Название: Re: как переопределить mouseDoubleClickEvent?
Отправлено: Senia_Bezrubashkin от Январь 22, 2013, 18:49
О! Блин... уже чайник стал. Уж лучше новичек. С чайника начинать нужно, по-ходу.


Название: Re: как переопределить mouseDoubleClickEvent?
Отправлено: kambala от Январь 22, 2013, 19:56
Или doubleClicked() это из QListView высылается, а у меня под MainWindow он заточен?
а открыть документацию и проверить не судьба? тем более я тебе в первом же сообщении темы писал в каком классе находится этот сигнал, а потом еще и в конце первой страницы.


Название: Re: как переопределить mouseDoubleClickEvent?
Отправлено: Senia_Bezrubashkin от Январь 22, 2013, 20:10
Или doubleClicked() это из QListView высылается, а у меня под MainWindow он заточен?
а открыть документацию и проверить не судьба? тем более я тебе в первом же сообщении темы писал в каком классе находится этот сигнал, а потом еще и в конце первой страницы.
На самом деле, я хотел малой кровью отделаться (использовать QListView по ссылке). А так, если делать, то 'doubleClicked' was not declared in this scope выходит. Ну, вот и попробовал (компилятор пропустил) в MainWindow переопределить doubleClicked(). Ну, сейчас уже понял, что ошибался.


Название: Re: как переопределить mouseDoubleClickEvent?
Отправлено: _OLEGator_ от Январь 22, 2013, 21:10
Пфф... умиляешь однако. А пост который над тем, что ты цитируешь не досуг прочитать? Или куда взгляд упал, то и читаем? А! Понял... тут эхо.  ;D

Хамло ты однако.
Тогда разжёвываю последний совет:
Ты переопределяешь  MainWindow::mouseDoubleClickEvent(QMouseEvent * me) у окна, а индекс определяешь в локальных координатах окна, поэтому он и пустой:
QModelIndex index(view_1->indexAt(me->pos()));
Нужно их перевести в локальные координаты view_1 для начала.

На этом все, в раздел для новичков я больше не отписываюсь.


Название: Re: как переопределить mouseDoubleClickEvent?
Отправлено: Senia_Bezrubashkin от Январь 22, 2013, 21:30
Хамло ты однако.
Тогда разжёвываю последний совет:
Ты переопределяешь  MainWindow::mouseDoubleClickEvent(QMouseEvent * me) у окна, а индекс определяешь в локальных координатах окна, поэтому он и пустой:
QModelIndex index(view_1->indexAt(me->pos()));
Нужно их перевести в локальные координаты view_1 для начала.

На этом все, в раздел для новичков я больше не отписываюсь.
Не грусти.  ;D А за совет спасибо.


Название: Re: как переопределить mouseDoubleClickEvent?
Отправлено: Bepec от Январь 23, 2013, 06:50
Присоединяюсь к _OLEGator_, но ещё и запоминаю ник.


Название: Re: как переопределить mouseDoubleClickEvent?
Отправлено: Senia_Bezrubashkin от Январь 23, 2013, 11:52
Ребятки, критика должна  быть конструктивной, советы по существу. А возгласы, типа, читай внимательней, бгг (при этом отписывать полную фигню (попросту флудить)) и т.п. не катит. А то что первый раз у всех когда-то был, так это руб за сто и нечего кичится своими знаниями и с высока вести беседу с новичками. Порой сформулировать вопрос  для них - уже проблема. Рекомендую быть по-доброжелательней и по-конкретней, вы тоже когда то начинали.Так что сами виноваты... и реакция моя вполне предсказуема.   8)


Название: Re: как переопределить mouseDoubleClickEvent?
Отправлено: carrygun от Январь 23, 2013, 12:41
Я бы посоветовал унаследоваться от QListView и там перекрыть mouseDoubleClickEvent(), а не перекрывать его в QMainWindow и мучиться с координатами.


Название: Re: как переопределить mouseDoubleClickEvent?
Отправлено: Senia_Bezrubashkin от Январь 23, 2013, 12:52
Я бы посоветовал унаследоваться от QListView и там перекрыть mouseDoubleClickEvent(), а не перекрывать его в QMainWindow и мучиться с координатами.
Буду пробовать, блин... башку уже сломал... на клики двойные рамка только реагирует.  >:(


Название: Re: как переопределить mouseDoubleClickEvent?
Отправлено: Igors от Январь 23, 2013, 13:08
Ребятки, критика должна  быть конструктивной ...
А этот Ваш пост конструктивен? А неск предыдущих? Там есть хоть что-нибудь по существу, по теме? Три с лишним недели Вы тянете кота за хвост и не можете сделать вещь на полчаса максимум (даже при отсутствии всяких сигналов и событий doubleClicked). Зато бойко огрызаетесь и пытаетесь учить других как надо себя вести :)

Народная примета: если человек не поздоровался создав тему - вероятно разговаривать с ним не стоит


Название: Re: как переопределить mouseDoubleClickEvent?
Отправлено: Senia_Bezrubashkin от Январь 23, 2013, 13:26
Ребятки, критика должна  быть конструктивной ...
А этот Ваш пост конструктивен? А неск предыдущих? Там есть хоть что-нибудь по существу, по теме? Три с лишним недели Вы тянете кота за хвост и не можете сделать вещь на полчаса максимум (даже при отсутствии всяких сигналов и событий doubleClicked). Зато бойко огрызаетесь и пытаетесь учить других как надо себя вести :)

Народная примета: если человек не поздоровался создав тему - вероятно разговаривать с ним не стоит
Ну, что тут скажешь... не могу ВАША правда, но и ВЫ кроме как оценить трехнедельный кошачий хвост, больше, по видимому, ни на что не способны. Не поздоровался я, видите ли... а еще на уши не встал. Думаю суть не в этом... сказать есть что тогда, когда мысли ясные, а так... понт садим и ку требуем... много раз. А по поводу "не стоит разговаривать" ВАШЕ право... так от чего же разговариваете? И шли бы мимо.


Название: Re: как переопределить mouseDoubleClickEvent?
Отправлено: Senia_Bezrubashkin от Январь 24, 2013, 09:36
Хамло ты однако.
Тогда разжёвываю последний совет:
Ты переопределяешь  MainWindow::mouseDoubleClickEvent(QMouseEvent * me) у окна, а индекс определяешь в локальных координатах окна, поэтому он и пустой:
QModelIndex index(view_1->indexAt(me->pos()));
Нужно их перевести в локальные координаты view_1 для начала.

На этом все, в раздел для новичков я больше не отписываюсь.
Так и есть... все уперлось в валидность индекса. Ну, и далее... (заметь, без надежд на ответ, но все-таки...)  :-[ Итак: О! Великий и всемогущий _OLEGator_, не соблаговолит ли, О! Свет несущий, открыть истину темному и неразумному чайнику в познании перевода координат между объектами?!! -Говоря это неразумный чайник делает пять ку-.


Название: Re: как переопределить mouseDoubleClickEvent?
Отправлено: carrygun от Январь 24, 2013, 10:42
Я сдаюсь, пример во вложении.


Название: Re: как переопределить mouseDoubleClickEvent?
Отправлено: Senia_Bezrubashkin от Январь 24, 2013, 17:14
Я сдаюсь, пример во вложении.
Сенкс, амиго! Посмотрю как это можно применить к моему случаю.