![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
Amadey |
![]()
Сообщение
#1
|
Студент ![]() Группа: Новичок Сообщений: 11 Регистрация: 1.4.2013 Пользователь №: 3773 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Доброго время суток! Очень нужна ваша помощь.
Есть "матрёшка" QDialog -> QGraphicsView -> QWidget -> QScrollArea -> (QLabel, QPushButton), собрано всё в дизайнере. Для ScrollArea сделан dragscroll с помощью фильтра событий (взято с форума developer.nokia). Dragscroll работает замечательно когда ScrollArea напрямую добавлена на Dialog, но в "матрёшке" dragscroll срабатывает только тогда когда мышка находиться на кнопке, на Label и свободной области ScrollArea не работает. Подозреваю что проблема в передаче событий через QGraphicsView, но в чём именно проблема не знаю. Изучаю Qt недавно и с событиями ещё очень плохо знаком. "матрёшка" понадобилась для поворота содержимого окна на 90 градусов. scroller - реализация dragscroll; form - QWidget Dialog - QDialog scroller.h Раскрывающийся текст #include <QObject> #include <QtGui> #include <QScrollArea> #include <QScrollBar> class Scroller : public QObject { Q_OBJECT public: explicit Scroller(QObject *parent = 0); protected: bool eventFilter(QObject *obj, QEvent *event); private: double y0; }; scroller.cpp Раскрывающийся текст #include "scroller.h" Scroller::Scroller(QObject *parent) : QObject(parent) { } bool Scroller::eventFilter(QObject *obj, QEvent *event) { if (event->type() == QEvent::MouseMove) { QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event); QScrollArea *view = qobject_cast<QScrollArea *>(obj->parent()); if (view && (mouseEvent->buttons() & Qt::LeftButton)) { QScrollBar *scroll = view->verticalScrollBar(); scroll->setValue(scroll->value() - mouseEvent->y() + y0); y0 = mouseEvent->y(); } } else if (event->type() == QEvent::MouseButtonPress) { QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event); if (mouseEvent->buttons() & Qt::LeftButton) y0 = mouseEvent->y(); } return QObject::eventFilter(obj, event); } form.h Раскрывающийся текст #include <QWidget> #include "scroller.h" namespace Ui { class Form; } class Form : public QWidget { Q_OBJECT public: explicit Form(QWidget *parent = 0); ~Form(); private: Ui::Form *ui; public: Scroller *scroller; }; form.cpp Раскрывающийся текст #include "form.h" #include "ui_form.h" Form::Form(QWidget *parent) : QWidget(parent), ui(new Ui::Form) { ui->setupUi(this); scroller = new Scroller(); ui->scrollArea->viewport()->installEventFilter(scroller); } Form::~Form() { delete ui; } dialog.h Раскрывающийся текст #include <QDialog> #include <QGraphicsScene> #include "form.h" namespace Ui { class Dialog; } class Dialog : public QDialog { Q_OBJECT public: explicit Dialog(QWidget *parent = 0); ~Dialog(); private: Ui::Dialog *ui; QGraphicsScene *scene; Form *form; }; dialog.cpp Раскрывающийся текст #include "dialog.h" #include "ui_dialog.h" Dialog::Dialog(QWidget *parent) : QDialog(parent), ui(new Ui::Dialog) { ui->setupUi(this); form = new Form(); scene = new QGraphicsScene(0,0,this->width(),this->height()); scene->addWidget(form); ui->graphicsView->setScene(scene); } Dialog::~Dialog() { delete ui; } dialog.ui Раскрывающийся текст <?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>Dialog</class> <widget class="QDialog" name="Dialog"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>624</width> <height>356</height> </rect> </property> <property name="windowTitle"> <string>Dialog</string> </property> <property name="windowOpacity"> <double>1.000000000000000</double> </property> <layout class="QVBoxLayout" name="verticalLayout"> <property name="spacing"> <number>0</number> </property> <property name="leftMargin"> <number>0</number> </property> <property name="topMargin"> <number>0</number> </property> <property name="rightMargin"> <number>0</number> </property> <property name="bottomMargin"> <number>0</number> </property> <item> <widget class="QGraphicsView" name="graphicsView"> <property name="frameShape"> <enum>QFrame::NoFrame</enum> </property> </widget> </item> </layout> </widget> <layoutdefault spacing="6" margin="11"/> <resources/> <connections/> </ui> form.ui Раскрывающийся текст <?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>Form</class> <widget class="QWidget" name="Form"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>552</width> <height>345</height> </rect> </property> <property name="windowTitle"> <string>Form</string> </property> <layout class="QVBoxLayout" name="verticalLayout"> <item> <widget class="QScrollArea" name="scrollArea"> <property name="widgetResizable"> <bool>true</bool> </property> <widget class="QWidget" name="scrollAreaWidgetContents"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>515</width> <height>415</height> </rect> </property> <layout class="QHBoxLayout" name="horizontalLayout"> <item> <layout class="QGridLayout" name="gridLayout"> <item row="0" column="0"> <widget class="QLabel" name="label_2"> <property name="font"> <font> <pointsize>16</pointsize> </font> </property> <property name="text"> <string>TextLabel</string> </property> </widget> </item> <item row="1" column="0"> <widget class="QLabel" name="label_3"> <property name="font"> <font> <pointsize>16</pointsize> </font> </property> <property name="text"> <string>TextLabel</string> </property> </widget> </item> <item row="2" column="0"> <widget class="QLabel" name="label"> <property name="font"> <font> <pointsize>16</pointsize> </font> </property> <property name="text"> <string>TextLabel</string> </property> </widget> </item> <item row="4" column="0"> <widget class="QLabel" name="label_4"> <property name="font"> <font> <pointsize>16</pointsize> </font> </property> <property name="text"> <string>TextLabel</string> </property> </widget> </item> <item row="5" column="0"> <widget class="QLabel" name="label_6"> <property name="font"> <font> <pointsize>16</pointsize> </font> </property> <property name="text"> <string>TextLabel</string> </property> </widget> </item> <item row="6" column="0"> <widget class="QLabel" name="label_5"> <property name="font"> <font> <pointsize>16</pointsize> </font> </property> <property name="text"> <string>TextLabel</string> </property> </widget> </item> <item row="7" column="0"> <widget class="QLabel" name="label_9"> <property name="font"> <font> <pointsize>16</pointsize> </font> </property> <property name="text"> <string>TextLabel</string> </property> </widget> </item> <item row="8" column="0"> <widget class="QLabel" name="label_11"> <property name="font"> <font> <pointsize>16</pointsize> </font> </property> <property name="text"> <string>TextLabel</string> </property> </widget> </item> <item row="9" column="0"> <widget class="QLabel" name="label_10"> <property name="font"> <font> <pointsize>16</pointsize> </font> </property> <property name="text"> <string>TextLabel</string> </property> </widget> </item> <item row="10" column="0"> <widget class="QLabel" name="label_12"> <property name="font"> <font> <pointsize>16</pointsize> </font> </property> <property name="text"> <string>TextLabel</string> </property> </widget> </item> <item row="11" column="0"> <widget class="QLabel" name="label_8"> <property name="font"> <font> <pointsize>16</pointsize> </font> </property> <property name="text"> <string>TextLabel</string> </property> </widget> </item> <item row="12" column="0"> <widget class="QLabel" name="label_7"> <property name="font"> <font> <pointsize>16</pointsize> </font> </property> <property name="text"> <string>TextLabel</string> </property> </widget> </item> <item row="3" column="0"> <widget class="QPushButton" name="pushButton"> <property name="text"> <string>PushButton</string> </property> </widget> </item> </layout> </item> </layout> </widget> </widget> </item> </layout> </widget> <resources/> <connections/> </ui> |
|
|
Trisch |
![]()
Сообщение
#2
|
![]() Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 379 Регистрация: 30.1.2012 Из: Запорожье Пользователь №: 3169 Спасибо сказали: 24 раз(а) Репутация: ![]() ![]() ![]() |
Да, надо переопределить события мыши mouseMoveEvent() для QGraphicsView.
|
|
|
Litkevich Yuriy |
![]()
Сообщение
#3
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
Amadey, используй тэг code при оформлении сообщений содержащих фрагменты исходных кодов
|
|
|
Amadey |
![]()
Сообщение
#4
|
Студент ![]() Группа: Новичок Сообщений: 11 Регистрация: 1.4.2013 Пользователь №: 3773 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Да, надо переопределить события мыши mouseMoveEvent() для QGraphicsView. Можно по подробнее? Что именно должно выполнять переопределённое mouseMoveEvent() для QGraphicsView? Amadey, используй тэг code при оформлении сообщений содержащих фрагменты исходных кодов Забыл поставить, каюсь, первый раз здесь пишу, в следующий раз буду внимательнее. |
|
|
Amadey |
![]()
Сообщение
#5
|
Студент ![]() Группа: Новичок Сообщений: 11 Регистрация: 1.4.2013 Пользователь №: 3773 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Нашел одну особенность: на кнопке отлавливается событие MouseMove, но не ловится событие MouseButtonPress, на лейблах всё в точности наоборот.
|
|
|
Trisch |
![]()
Сообщение
#6
|
![]() Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 379 Регистрация: 30.1.2012 Из: Запорожье Пользователь №: 3169 Спасибо сказали: 24 раз(а) Репутация: ![]() ![]() ![]() |
Amadey,
В идеале, mouseMoveEvent() должен перенаправить события мыши объекту который отвечает за "скролинг". Цитата Нашел одну особенность: на кнопке отлавливается событие MouseMove, но не ловится событие MouseButtonPress, на лейблах всё в точности наоборот. Не совсем понял. При нажатии на кнопку мыши над кнопкой, не происходит скролинг? Ну тогда, все правильно, так как кнопка отлавливает события нажатия мыши. |
|
|
Amadey |
![]()
Сообщение
#7
|
Студент ![]() Группа: Новичок Сообщений: 11 Регистрация: 1.4.2013 Пользователь №: 3773 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Цитата Не совсем понял. При нажатии на кнопку мыши над кнопкой, не происходит скролинг? Ну тогда, все правильно, так как кнопка отлавливает события нажатия мыши. Событие не отлавливается фильтром установленным на ScrollArea->view(), впрочем события на кнопку не важны, в конечном итоге от кнопок отказались, теперь всё пространство ScrollArea занимают лейблы, но на лейблах не работает mouseMove. |
|
|
Trisch |
![]()
Сообщение
#8
|
![]() Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 379 Регистрация: 30.1.2012 Из: Запорожье Пользователь №: 3169 Спасибо сказали: 24 раз(а) Репутация: ![]() ![]() ![]() |
Можете скинуть проект в архиве?
|
|
|
Amadey |
![]()
Сообщение
#9
|
Студент ![]() Группа: Новичок Сообщений: 11 Регистрация: 1.4.2013 Пользователь №: 3773 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
Trisch |
![]()
Сообщение
#10
|
![]() Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 379 Регистрация: 30.1.2012 Из: Запорожье Пользователь №: 3169 Спасибо сказали: 24 раз(а) Репутация: ![]() ![]() ![]() |
Как я понял вам надо при зажатии кнопки мыши над лейблалы можно было скролить?
Просто задайте объекту Form родителя. Как-то так:
|
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 1.4.2025, 23:45 |