crossplatform.ru

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

RazrFalcon
  опции профиля:
сообщение 23.3.2011, 23:39
Сообщение #1


Zombie Mod
*****

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

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




Репутация:   212  


Главное(и единственное) окно - наследник QGraphicsView.
Но, mouseMoveEvent срабатывает только при нажатии ЛКМ, setMouseTracking(true); - не помогло.
Нужно отловить положение мышки относительно QGraphicsView/QGraphicsScene.

PS: проблема в том, что кроме QGraphicsView у меня должны быть и другие элементы на форме, но тогда я не могу перехватить положение мыши...
То есть, если главное окно наследник QMainWindow, то как отловить положение мыши над QGraphicsView?

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
3 страниц V   1 2 3 >  
Начать новую тему
Ответов (1 - 28)
abc
  опции профиля:
сообщение 24.3.2011, 0:08
Сообщение #2


Участник
**

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

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




Репутация:   4  


а что хочешь делать с этим MoveEvent?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 24.3.2011, 8:10
Сообщение #3


фрилансер
******

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

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




Репутация:   34  


наверное

void QWidget::setMouseTracking ( bool enable )

сорри, невнимательно прочитал - уже пробовалось, оказывается

Сообщение отредактировал Алексей1153 - 24.3.2011, 8:11
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 24.3.2011, 8:23
Сообщение #4


Zombie Mod
*****

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

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




Репутация:   212  


Суть:
есть окно, наследник QGraphicsView. Из-за этого на все окно растянут QGraphicsView, других элементов нет. При нажатии пишет в консоль положение курсора, а мне нужно, что бы просто при наведении писало. Под мышкой должна рисоваться вертикальная линия. В примерах Qwt такое есть, но он мне не подходит, да и не нужен в общем.

В добавок, я не пойму как теперь еще, к примеру, кнопку добавить на виджет.

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


Участник
**

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

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




Репутация:   4  


если ты в дизайнере поставишь setMouseTracking на графиквью, то всё прокатит, и вот как это сделать кодом:
graphicsView->viewport()->setMouseTracking(1);

дело в том, что у QGrapchicsView, у QTextEdit, у QTableWidget и т.д. есть этот viewport, та белая область, в которой и происходят все гадости

"кнопку на виджет"?.. кнопку на сцену?

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


Zombie Mod
*****

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

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




Репутация:   212  


Не вышло.
Вот код:
.cpp
Раскрывающийся текст
#include "plot.h"
#include <QtDebug>

Plot::Plot()
{
    QGraphicsScene *scene = new QGraphicsScene();

    QPen pen(Qt::black, 2.0);

    //setMouseTracking(true);

    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()<<"-------------";
    }

    setScene(scene);
    setDragMode(QGraphicsView::ScrollHandDrag);
    setRenderHint(QPainter::Antialiasing, true);
    viewport()->setMouseTracking(true);

    //setMouseTracking(true);

    //setWindowState(Qt::WindowMaximized);
    resize(560,350);
}

void Plot::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
    qDebug()<<event->scenePos();
}


.h
Раскрывающийся текст
#ifndef PLOT_H
#define PLOT_H

#include <QtGui>
#include <QMainWindow>

class Plot : public QGraphicsView
{
    Q_OBJECT

public:
    Plot();

private:
    void mouseMoveEvent(QGraphicsSceneMouseEvent *event);

};
#endif // PLOT_H


Выглядит то так:

Как сюда другие элементы добавлять?

PS: я понимаю что это все звучит по идиотски, но я на этом застрял прилично.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
abc
  опции профиля:
сообщение 24.3.2011, 15:00
Сообщение #7


Участник
**

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

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




Репутация:   4  


где ты нашёл этот метод?
void mouseMoveEvent(QGraphicsSceneMouseEvent *event);

я у QGraphicsView вижу только такой
void mouseMoveEvent ( QMouseEvent * event )

поменяй, заработает

Если виджеты на сцену, то QGraphicsScene::addWidget
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 24.3.2011, 15:12
Сообщение #8


Zombie Mod
*****

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

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




Репутация:   212  


Ура, работает.

>>Если виджеты на сцену, то QGraphicsScene::addWidget
Нужно вот что:

Если бы это был наследник QMainWindow - то понятно, а тут как? Я просто с этим впервые сталкиваюсь.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
abc
  опции профиля:
сообщение 24.3.2011, 15:19
Сообщение #9


Участник
**

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

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




Репутация:   4  


зачем ты полез наследоваться от вью?
создай виджет или мэйнвиндоу, как обычно, положи на него вью и всё, что надо
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 24.3.2011, 15:24
Сообщение #10


Zombie Mod
*****

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

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




Репутация:   212  


Но тогда я буду перехватывать положение курсора относительно виджета, а не 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
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
abc
  опции профиля:
сообщение 24.3.2011, 19:25
Сообщение #21


Участник
**

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

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




Репутация:   4  


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


Zombie Mod
*****

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

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




Репутация:   212  


Ну, к примеру, что бы при растягивании, таблица растягивалась, а все остальные элементы, к примеру кнопки, оставались на местах.
Сложно объяснить, скорее всего ошибки новичка, не более.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
abc
  опции профиля:
сообщение 24.3.2011, 19:50
Сообщение #23


Участник
**

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

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




Репутация:   4  


это делается с помощью распорок (Spacer), а попросить кнопку не изменять размеры можно с помощью sizePolicy

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


Zombie Mod
*****

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

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




Репутация:   212  


Раньше я этого не знал, сейчас уже знаю.
Без дизайнера мне проще, все на виду, я об опциях/настройках.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
abc
  опции профиля:
сообщение 24.3.2011, 20:43
Сообщение #25


Участник
**

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

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




Репутация:   4  


как это на виду без него?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 24.3.2011, 21:10
Сообщение #26


Zombie Mod
*****

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

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




Репутация:   212  


Я имею ввиду, что мне удобней самому все создавать, появляется чувство контроля, вот и все. Привычка и все тут. И не надо выкладывать ui =)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
abc
  опции профиля:
сообщение 24.3.2011, 21:26
Сообщение #27


Участник
**

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

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




Репутация:   4  


с дизайнером можно почувствовать, что ты программист ВЫСОКОГО уровня :D
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 24.3.2011, 22:11
Сообщение #28


Zombie Mod
*****

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

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




Репутация:   212  


:lol:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
MetalKrot
  опции профиля:
сообщение 18.8.2011, 12:06
Сообщение #29


Новичок


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

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




Репутация:   0  


Цитата
Рабочий пример:


не очень то и рабочий. у меня move ловит только на краю graphicsView. почему не хочет в центре ловить?

мужики, извиняйте, разобрался)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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


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