![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
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 раз(а) Репутация: ![]() ![]() ![]() |
Amadey,
В идеале, mouseMoveEvent() должен перенаправить события мыши объекту который отвечает за "скролинг". Цитата Нашел одну особенность: на кнопке отлавливается событие MouseMove, но не ловится событие MouseButtonPress, на лейблах всё в точности наоборот. Не совсем понял. При нажатии на кнопку мыши над кнопкой, не происходит скролинг? Ну тогда, все правильно, так как кнопка отлавливает события нажатия мыши. |
|
|
Amadey |
![]()
Сообщение
#3
|
Студент ![]() Группа: Новичок Сообщений: 11 Регистрация: 1.4.2013 Пользователь №: 3773 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Цитата Не совсем понял. При нажатии на кнопку мыши над кнопкой, не происходит скролинг? Ну тогда, все правильно, так как кнопка отлавливает события нажатия мыши. Событие не отлавливается фильтром установленным на ScrollArea->view(), впрочем события на кнопку не важны, в конечном итоге от кнопок отказались, теперь всё пространство ScrollArea занимают лейблы, но на лейблах не работает mouseMove. |
|
|
Trisch |
![]()
Сообщение
#4
|
![]() Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 379 Регистрация: 30.1.2012 Из: Запорожье Пользователь №: 3169 Спасибо сказали: 24 раз(а) Репутация: ![]() ![]() ![]() |
Можете скинуть проект в архиве?
|
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 7.4.2025, 5:22 |