Russian Qt Forum

Qt => Общие вопросы => Тема начата: ged от Май 12, 2008, 18:05



Название: Как переписать события для виджетов из .ui ?
Отправлено: ged от Май 12, 2008, 18:05
В designer'е создал форму, на которой, среди прочего, располагается QGraphicsView под именем graphicsView.
Пробовал в коде переписать события мыши т.о. :

Код:
void QGraphicsView::mousePressEvent(QMouseEvent* pe)
{
this->setCursor(Qt::PointingHandCursor);
}

void QGraphicsView::mouseReleaseEvent(QMouseEvent* pe)
{
this->unsetCursor();
}

Не работает, точнее работает для самой формы, а не для QGraphicsView :\

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

Код:
#include <QApplication>
#include "testmouseevents.h"
#include <QBoxLayout>
#include <QGraphicsView>

int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QWidget mw;
QGraphicsView *graphicsView = new QGraphicsView;
QBoxLayout *d = new QBoxLayout(QBoxLayout::LeftToRight);
d->addWidget(graphicsView);
mw.setLayout(d);
mw.show();
return app.exec();
}

void QGraphicsView::mousePressEvent(QMouseEvent* pe)
{
this->setCursor(Qt::PointingHandCursor);
}

void QGraphicsView::mouseReleaseEvent(QMouseEvent* pe)
{
this->unsetCursor();
}

P.S. Qt 4.3.3, если это важно.


Название: Re: Как переписать события для виджетов из .ui ?
Отправлено: lit-uriy от Май 12, 2008, 22:27
вообще я думаю, это плохая затея Qt'явый класс трогать, надо от него наследника сделать, и его уже менять как тебе вздумается. А вдизайнере можно указывать от какого класса твой виджет. Ищи слово "promote"


Название: Re: Как переписать события для виджетов из .ui ?
Отправлено: ged от Май 13, 2008, 09:43
Короче наверное проще раскидать виджеты вручную в коде, но я думал, что можно "как-нить так" ). А если я переделаю QGraphicsView во что-то свое и потом добавлю его в виджеты designer'а нельзя будет для него переписать события? "Promote" не нашел ни в свойствах designer'а, ни в assistant. Где его искать?

P.S. Все, нашел Promote to... Похоже это то, что надо, спасибо :)

P.P.S.

Вроде как сделал, но опять то же самое. В Promote to... указал Base class name: QGraphicsView, Promoted class name: MainView, Header file: mainview.h, Global include: on, нажал Add. Опять правой по виджету, Promote to -> MainView.
Создал файлы mainview.h и mainview.cpp следующего содержания:

mainview.h:
Код:
#ifndef MAINVIEW_H
#define MAINVIEW_H

#include <QGraphicsView>

class MainView : public QGraphicsView
{
    Q_OBJECT

public:
    MainView(QWidget *parent = 0);

protected:
void mousePressEvent(QMouseEvent* pe);
void mouseReleaseEvent(QMouseEvent* pe);
};

#endif

mainview.cpp:
Код:
#include <mainview.h>

MainView::MainView(QWidget *parent)
{
QGraphicsView *graphicsView;
}

void MainView::mousePressEvent(QMouseEvent* pe)
{
this->setCursor(Qt::PointingHandCursor);
}

void MainView::mouseReleaseEvent(QMouseEvent* pe)
{
this->unsetCursor();
}

Опять все работает для формы, но не для graphicsView. В ui_airport.h graphicsView создается вот так:
graphicsView = new MainView(centralwidget);
Централ виджет:
centralwidget = new QWidget(MainWindow);
МэйнВиндоу это класс формы airport.ui.

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


Название: Re: Как переписать события для виджетов из .ui ?
Отправлено: lit-uriy от Май 13, 2008, 20:14
курсор-рука должен появлятся на QGraphicsView и только на нем, когда кнопку мыша щелкаешь, так?


Название: Re: Как переписать события для виджетов из .ui ?
Отправлено: lit-uriy от Май 13, 2008, 20:58
тестовый проект во вложении


Название: Re: Как переписать события для виджетов из .ui ?
Отправлено: ged от Май 13, 2008, 21:31
Спасибо. Твоя версия работает именно так, как надо, будем ковырять и курить маны :)

Добавлено 14.05.2008:

Вот что выяснилось, твоя программа работает и если я сам сделаю такую же на основе QWidget тоже работает. Но беда в том, что у меня QMainWindow и там, опять все проваливается в черную дыру. Есть подозрение, что это из-за centralWidget. Есть какие-нибудь предположения?
Кстати, у меня перед этим не собиралось, потому что я выделил в проекте подпроект с библиотекой и у меня в итоге сама программа начала собираться в src и тихо там существовать никого не трогая, а загружалась старая версия из bin за 6 мая и естесственно ничего не менялось :)


Название: Re: Как переписать события для виджетов из .ui ?
Отправлено: lit-uriy от Май 14, 2008, 10:38
а что тебе мешает сделать окно на основе QWidget'а, а потом его воткнуть в QMainWindow как центральный виджет.
Т.е. если говорить о моем примере, то в качестве центрального виджета выбирай класс Dialog.
 к слову сказать крыжик "Global include:" я не устанавливал.


Название: Re: Как переписать события для виджетов из .ui ?
Отправлено: ged от Май 14, 2008, 17:39
Мешает только неумение это делать. Попробовал прилепить форму QWidget к форме QMainWindow с помощью setCentralWidget теперь у меня на любое событие реакция Segmantation fault, события мыши не отслеживаются. А нет больше мыслей как достучаться до тех виджетов которые попадают в centralWidget?


Название: Re: Как переписать события для виджетов из .ui ?
Отправлено: ged от Май 15, 2008, 17:48
Короче как это сделать с помощью дизайнера так не понял, вручную написал, работает. Если разберусь - опишу.