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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как переписать события для виджетов из .ui ?  (Прочитано 7575 раз)
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, если это важно.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #1 : Май 12, 2008, 22:27 »

вообще я думаю, это плохая затея Qt'явый класс трогать, надо от него наследника сделать, и его уже менять как тебе вздумается. А вдизайнере можно указывать от какого класса твой виджет. Ищи слово "promote"
Записан

Юра.
ged
Гость
« Ответ #2 : Май 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.

Чую что-то я сделал совсем не так как надо, прошу помочь, потому что всем этим занимаюсь впервые, а разобраться надо.
« Последнее редактирование: Май 13, 2008, 16:03 от ged » Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #3 : Май 13, 2008, 20:14 »

курсор-рука должен появлятся на QGraphicsView и только на нем, когда кнопку мыша щелкаешь, так?
« Последнее редактирование: Май 13, 2008, 20:53 от lit-uriy » Записан

Юра.
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #4 : Май 13, 2008, 20:58 »

тестовый проект во вложении
Записан

Юра.
ged
Гость
« Ответ #5 : Май 13, 2008, 21:31 »

Спасибо. Твоя версия работает именно так, как надо, будем ковырять и курить маны Улыбающийся

Добавлено 14.05.2008:

Вот что выяснилось, твоя программа работает и если я сам сделаю такую же на основе QWidget тоже работает. Но беда в том, что у меня QMainWindow и там, опять все проваливается в черную дыру. Есть подозрение, что это из-за centralWidget. Есть какие-нибудь предположения?
Кстати, у меня перед этим не собиралось, потому что я выделил в проекте подпроект с библиотекой и у меня в итоге сама программа начала собираться в src и тихо там существовать никого не трогая, а загружалась старая версия из bin за 6 мая и естесственно ничего не менялось Улыбающийся
« Последнее редактирование: Май 14, 2008, 09:38 от ged » Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #6 : Май 14, 2008, 10:38 »

а что тебе мешает сделать окно на основе QWidget'а, а потом его воткнуть в QMainWindow как центральный виджет.
Т.е. если говорить о моем примере, то в качестве центрального виджета выбирай класс Dialog.
 к слову сказать крыжик "Global include:" я не устанавливал.
« Последнее редактирование: Май 14, 2008, 10:42 от lit-uriy » Записан

Юра.
ged
Гость
« Ответ #7 : Май 14, 2008, 17:39 »

Мешает только неумение это делать. Попробовал прилепить форму QWidget к форме QMainWindow с помощью setCentralWidget теперь у меня на любое событие реакция Segmantation fault, события мыши не отслеживаются. А нет больше мыслей как достучаться до тех виджетов которые попадают в centralWidget?
Записан
ged
Гость
« Ответ #8 : Май 15, 2008, 17:48 »

Короче как это сделать с помощью дизайнера так не понял, вручную написал, работает. Если разберусь - опишу.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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