crossplatform.ru

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

3 страниц V  < 1 2 3 >  
Ответить в данную темуНачать новую тему
> Перемещение мыши над QGraphicsView
abc
  опции профиля:
сообщение 24.3.2011, 16:02
Сообщение #11


Участник
**

Группа: Участник
Сообщений: 221
Регистрация: 16.12.2010
Из: СПб
Пользователь №: 2272

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




Репутация:   4  


ты не знаком с eventFilter?
http://doc.crossplatform.ru/qt/4.6.x/eventsandfilters.html
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 24.3.2011, 16:42
Сообщение #12


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

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




Репутация:   212  


нет =/
Никогда раньше не сталкивался. Вот что получилось:
Раскрывающийся текст
#include "plot.h"
#include <QtDebug>

Plot::Plot()
{
    graphicsView = new QGraphicsView;
    graphicsView->installEventFilter(this);
    QGraphicsScene *scene = new QGraphicsScene();

    QPen pen(Qt::black, 2.0);

    qsrand(QDateTime::currentDateTime().toTime_t());

    int x1=0;
    int x2=0;
    int y1=0;
    int y2=0;
    for (int i=1,s=5; i<11; i++, s+=5)
    {
        x2 = x1+s;
        y2 = qrand()%100;

        scene->addLine(x1,y1,x2,y2,pen);
        qDebug()<<x1<<y1<<x2<<y2;

        x1 = x2;
        y1 = y2;
        x2 = s*(i+1);
        y2 = qrand()%100;

        scene->addLine(x1,y1,x2,y2,pen);
        qDebug()<<x1<<y1<<x2<<y2;

        x1 = x2;
        y1 = y2;

        qDebug()<<"-------------";
    }

    vLine = new QGraphicsLineItem;

    vLine->setLine(10,0,10,height());
    scene->addItem(vLine);

    graphicsView->setScene(scene);
    scene->setSceneRect(0,0,560,350);
    //setDragMode(QGraphicsView::ScrollHandDrag);
    graphicsView->setRenderHint(QPainter::Antialiasing, true);
    graphicsView->viewport()->setMouseTracking(true);

    setCentralWidget(graphicsView);
}

bool Plot::eventFilter(QObject *obj, QEvent *event)
{
     if (obj == graphicsView) {
         if (event->type() == QEvent::MouseMove)
         {
             QMouseEvent *mEvent = static_cast<QMouseEvent*>(event);
             //QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);
             //qDebug() << "Ate key press" << keyEvent->key();
             qDebug() << mEvent->pos();
             return true;
         } else {
             return false;
         }
     } else {
         // pass the event on to the parent class
         return QMainWindow::eventFilter(obj, event);
     }
}

Ничего...
На QEvent::MouseButtonPress срабатывает =/
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
abc
  опции профиля:
сообщение 24.3.2011, 16:52
Сообщение #13


Участник
**

Группа: Участник
Сообщений: 221
Регистрация: 16.12.2010
Из: СПб
Пользователь №: 2272

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




Репутация:   4  


опять же viewport
graphicsView->viewport->installEventFilter(this);
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 24.3.2011, 17:03
Сообщение #14


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

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




Репутация:   212  


Не помогло :unsure:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
abc
  опции профиля:
сообщение 24.3.2011, 17:24
Сообщение #15


Участник
**

Группа: Участник
Сообщений: 221
Регистрация: 16.12.2010
Из: СПб
Пользователь №: 2272

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




Репутация:   4  


это в любом случае нужно возвращать, а у тебя в else
return QMainWindow::eventFilter(obj, event);

не знаю, что ещё, должно работать
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 24.3.2011, 17:46
Сообщение #16


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

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




Репутация:   212  


:blink:
без else вообще не работает, просто пустой QGraphicsView
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
abc
  опции профиля:
сообщение 24.3.2011, 18:48
Сообщение #17


Участник
**

Группа: Участник
Сообщений: 221
Регистрация: 16.12.2010
Из: СПб
Пользователь №: 2272

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




Репутация:   4  


забудь про else)
Цитата(RazrFalcon @ 24.3.2011, 16:42) *
obj == graphicsView

вот здесь твой obj не graphicsView, а graphicsView->viewport()
а на самом деле, тебе вовсе не нужно проверять что за obj послал событие, если ты установил фильтр только на один виджет, obj по-любому будет он
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 24.3.2011, 19:07
Сообщение #18


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

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




Репутация:   212  


Рабочий пример:
.cpp
Раскрывающийся текст
#include "plot.h"
#include <QtDebug>

Plot::Plot()
{
    graphicsView = new QGraphicsView;
    button = new QPushButton("Button");

    QGridLayout *layout = new QGridLayout;
    layout->addWidget(graphicsView,0,0);
    layout->addWidget(button,1,0);
    QWidget *widget = new QWidget;
    widget->setLayout(layout);
    setCentralWidget(widget);

    qsrand(QDateTime::currentDateTime().toTime_t());

    QGraphicsScene *scene = new QGraphicsScene();
    QPen pen(Qt::black, 2.0);

    int x1=0;
    int x2=0;
    int y1=0;
    int y2=0;
    for (int i=1,s=5; i<11; i++, s+=5)
    {
        x2 = x1+s;
        y2 = qrand()%100;

        scene->addLine(x1,y1,x2,y2,pen);
        qDebug()<<x1<<y1<<x2<<y2;

        x1 = x2;
        y1 = y2;
        x2 = s*(i+1);
        y2 = qrand()%100;

        scene->addLine(x1,y1,x2,y2,pen);
        qDebug()<<x1<<y1<<x2<<y2;

        x1 = x2;
        y1 = y2;

        qDebug()<<"-------------";
    }

    vLine = new QGraphicsLineItem;
    vLine->setLine(10,0,10,height());
    scene->addItem(vLine);

    graphicsView->setScene(scene);
    scene->setSceneRect(0,0,550,350);
    //setDragMode(QGraphicsView::ScrollHandDrag);
    graphicsView->setRenderHint(QPainter::Antialiasing, true);
    graphicsView->viewport()->setMouseTracking(true);
    graphicsView->viewport()->installEventFilter(this);

}

bool Plot::eventFilter(QObject *obj, QEvent *event)
{
         if (event->type() == QEvent::MouseMove)
         {
             QMouseEvent *mEvent = static_cast<QMouseEvent*>(event);
             qDebug()<< mEvent->pos().x();
             vLine->setPos(mEvent->pos().x()-9,0);
             return true;
         }
         else
         {
             return false;
         }

         return QMainWindow::eventFilter(obj, event);
}
.h
Раскрывающийся текст
#ifndef PLOT_H
#define PLOT_H

#include <QtGui>
#include <QMainWindow>

class Plot : public QMainWindow
{
    Q_OBJECT

public:
    Plot();

protected:
     bool eventFilter(QObject *obj, QEvent *ev);

private:
    QGraphicsView *graphicsView;
    QGraphicsLineItem *vLine;
    QPushButton *button;
};

#endif // PLOT_H

PS:
QGridLayout *layout = new QGridLayout;
layout->addWidget(graphicsView,0,0);
layout->addWidget(button,1,0);
QWidget *widget = new QWidget;
widget->setLayout(layout);
setCentralWidget(widget);
Это нормально, или есть более правильный метод?

Сообщение отредактировал RazrFalcon - 24.3.2011, 19:08
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
abc
  опции профиля:
сообщение 24.3.2011, 19:12
Сообщение #19


Участник
**

Группа: Участник
Сообщений: 221
Регистрация: 16.12.2010
Из: СПб
Пользователь №: 2272

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




Репутация:   4  


пользуюсь дизайнером) а ты почему нет?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 24.3.2011, 19:18
Сообщение #20


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

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




Репутация:   212  


Часто писали что так проще, да и мне уже стало проще.
+ не надо думать о ресайзе долго, раньше я через resizeEvent все пересчитывал.
В общем можно и в дизайнере, просто я раньше не знал как там многое реализовать, но особых преимуществ пока не вижу.
"Работает - не трожь" =)

+ особенно после этой темы
http://www.forum.crossplatform.ru/index.php?showtopic=6236

Сообщение отредактировал RazrFalcon - 24.3.2011, 19:21
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 29.3.2024, 1:04