crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Dragscroll QScrollArea внутри QGraphicsView
Amadey
  опции профиля:
сообщение 7.8.2014, 8:59
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 11
Регистрация: 1.4.2013
Пользователь №: 3773

Спасибо сказали: 0 раз(а)




Репутация:   1  


Доброго время суток! Очень нужна ваша помощь.
Есть "матрёшка" 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
  опции профиля:
сообщение 7.8.2014, 20:48
Сообщение #2


Активный участник
***

Группа: Участник
Сообщений: 379
Регистрация: 30.1.2012
Из: Запорожье
Пользователь №: 3169

Спасибо сказали: 24 раз(а)




Репутация:   0  


Да, надо переопределить события мыши mouseMoveEvent() для QGraphicsView.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 8.8.2014, 7:09
Сообщение #3


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Amadey, используй тэг code при оформлении сообщений содержащих фрагменты исходных кодов
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Amadey
  опции профиля:
сообщение 8.8.2014, 7:59
Сообщение #4


Студент
*

Группа: Новичок
Сообщений: 11
Регистрация: 1.4.2013
Пользователь №: 3773

Спасибо сказали: 0 раз(а)




Репутация:   1  


Цитата(Trisch @ 7.8.2014, 21:48) *
Да, надо переопределить события мыши mouseMoveEvent() для QGraphicsView.

Можно по подробнее? Что именно должно выполнять переопределённое mouseMoveEvent() для QGraphicsView?

Цитата(Litkevich Yuriy @ 8.8.2014, 8:09) *
Amadey, используй тэг code при оформлении сообщений содержащих фрагменты исходных кодов

Забыл поставить, каюсь, первый раз здесь пишу, в следующий раз буду внимательнее.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Amadey
  опции профиля:
сообщение 8.8.2014, 8:31
Сообщение #5


Студент
*

Группа: Новичок
Сообщений: 11
Регистрация: 1.4.2013
Пользователь №: 3773

Спасибо сказали: 0 раз(а)




Репутация:   1  


Нашел одну особенность: на кнопке отлавливается событие MouseMove, но не ловится событие MouseButtonPress, на лейблах всё в точности наоборот.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Trisch
  опции профиля:
сообщение 9.8.2014, 16:54
Сообщение #6


Активный участник
***

Группа: Участник
Сообщений: 379
Регистрация: 30.1.2012
Из: Запорожье
Пользователь №: 3169

Спасибо сказали: 24 раз(а)




Репутация:   0  


Amadey,

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

Цитата
Нашел одну особенность: на кнопке отлавливается событие MouseMove, но не ловится событие MouseButtonPress, на лейблах всё в точности наоборот.


Не совсем понял. При нажатии на кнопку мыши над кнопкой, не происходит скролинг? Ну тогда, все правильно, так как кнопка отлавливает события нажатия мыши.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Amadey
  опции профиля:
сообщение 10.8.2014, 9:24
Сообщение #7


Студент
*

Группа: Новичок
Сообщений: 11
Регистрация: 1.4.2013
Пользователь №: 3773

Спасибо сказали: 0 раз(а)




Репутация:   1  


Цитата
Не совсем понял. При нажатии на кнопку мыши над кнопкой, не происходит скролинг? Ну тогда, все правильно, так как кнопка отлавливает события нажатия мыши.


Событие не отлавливается фильтром установленным на ScrollArea->view(), впрочем события на кнопку не важны, в конечном итоге от кнопок отказались, теперь всё пространство ScrollArea занимают лейблы, но на лейблах не работает mouseMove.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Trisch
  опции профиля:
сообщение 11.8.2014, 1:26
Сообщение #8


Активный участник
***

Группа: Участник
Сообщений: 379
Регистрация: 30.1.2012
Из: Запорожье
Пользователь №: 3169

Спасибо сказали: 24 раз(а)




Репутация:   0  


Можете скинуть проект в архиве?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Amadey
  опции профиля:
сообщение 11.8.2014, 6:54
Сообщение #9


Студент
*

Группа: Новичок
Сообщений: 11
Регистрация: 1.4.2013
Пользователь №: 3773

Спасибо сказали: 0 раз(а)




Репутация:   1  


Цитата(Trisch @ 11.8.2014, 2:26) *
Можете скинуть проект в архиве?

Сюда загрузить не удалось.
http://rghost.ru/57403274
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Trisch
  опции профиля:
сообщение 11.8.2014, 22:02
Сообщение #10


Активный участник
***

Группа: Участник
Сообщений: 379
Регистрация: 30.1.2012
Из: Запорожье
Пользователь №: 3169

Спасибо сказали: 24 раз(а)




Репутация:   0  


Как я понял вам надо при зажатии кнопки мыши над лейблалы можно было скролить?

Просто задайте объекту Form родителя.

Как-то так:
...
form = new Form(this);
...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 19.4.2024, 17:35