crossplatform.ru

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

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>
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Litkevich Yuriy
  опции профиля:
сообщение 8.8.2014, 7:09
Сообщение #2


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

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

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




Репутация:   94  


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

Сообщений в этой теме


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


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


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 4.4.2025, 16:16