Russian Qt Forum
Ноябрь 23, 2024, 17:39 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Создание класса  (Прочитано 3374 раз)
borik120
Гость
« : Июль 14, 2011, 23:08 »

.h
Код:
#ifndef FACEWINDOW_H
#define FACEWINDOW_H

#include <QWidget>
#include <QString>
#include <QImage>
#include <QPainter>
#include <QRectF>
#include <QtGui>
#include <QLayout>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QPixmap>
#include <QGraphicsLineItem>
class FaceWindow
{
public:
    FaceWindow();
   QWidget m_facewindow;
   QString m_opendirectory; //Директория изображения
   QGraphicsScene m_scene;

   QGraphicsView m_view;
 QGraphicsLineItem line1,line2;




};


#endif // FACEWINDOW_H

.cpp
Код:
#include "facewindow.h"

#include <QFileDialog>
#include <QLayout>
#include <QGraphicsPixmapItem>

FaceWindow::FaceWindow()
{



  QGraphicsPixmapItem *m_pItem = new QGraphicsPixmapItem;

  QPixmap *m_picture = new QPixmap;

  m_view.setScene(&m_scene);


  m_view.setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
  m_view.setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);

  m_opendirectory = QFileDialog::getOpenFileName(0,"Open Dialog","","*.jpg"); //загрузка изображения в pixmap
  m_picture->load(m_opendirectory);



  m_pItem->setPixmap(*m_picture);
  m_scene.addItem(m_pItem);


  m_view.scale(0.2,0.2);                    //тут добавить scale в реальном временни
  m_view.setFixedSize(m_view.sizeHint());   //Установка фиксированого размера для окна



  m_view.show();



}
есть класс FaceWindow, в нем создается объект QGraphicsScene и QGraphicsView. потом в сцену загружается изображение из выбранной директории.
я хочу сделать так чтобы помимо изображения в сцене присутствовали "крестики" так сказать ну как отдельные объекты, чтобы их можно было двигать мышкой итд. я хочу создать класс, в нем два объекта QGraphicsLineItem, перекрестить их, и обьеденить в QGraphicsItemGroup. а потом создавать эти крестики как отдельные объекты в классе FaceWindow. только не могу понять, как мне объявить класс "крестиков" чтобы потом при добавлении их в сцену я мог написать: scene.addItem(krestik1). мне кажется я что то сильно недогоняю относительно работы с классами)
может есть более простой способ реализовать это? буду рад любой подсказке:)
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Июль 15, 2011, 11:25 »

Достаточно отнаследоваться, например, от QGraphicsRectItem и перегрузить paint():
Код
C++ (Qt)
class MyCrossItem : public QGraphicsRectItem
{
public:
     MyCrossItem( const QRectF& rect, QGraphicsItem* parent = 0 )
     : QGraphicsRectItem ( rect, parent ) {}
     virtual void ~MyCrossItem() {}
 
protected:
    void paint( QPainter* painter, const QStyleOptionGraphicsItem * option, QWidget * widget = 0 )
    {
          painter->drawLine( rect().topLeft(), rect().bottomRight() );
          painter->drawLine( rect().topRight(), rect().bottomLeft() );
    }
};
Записан

Qt 5.11/4.8.7 (X11/Win)
borik120
Гость
« Ответ #2 : Июль 22, 2011, 00:00 »

Попробовал унаследоваться от QGraphicsItemGroup

Код:
#ifndef EYE_H
#define EYE_H

#include <QGraphicsItemGroup>
#include <QGraphicsLineItem>
#include <QPen>
#include <QGraphicsItem>
class Eye : public QGraphicsItemGroup
{
public:

    Eye(int a,int b);

    private:

    QGraphicsLineItem mLineHorizontal,mLineVertical;
    QPen mPen;
    int x,y;
};

#endif // EYE_H

Код:
#include "eye.h"

Eye::Eye(int a,int b)
{
    mPen.setWidth(10);
    this->x=a;
    this->y=b;

    mLineVertical.setPen(mPen);
    mLineHorizontal.setPen(mPen);

    mLineVertical.setLine(x,y-10,x,y+10);
    mLineHorizontal.setLine(x-10,y,x+10,y);


    mLineVertical.show();
    mLineHorizontal.show();
    this->addToGroup(&mLineVertical);
    this->addToGroup(&mLineHorizontal);


    this->show();


}

когда в главном файле пишу
Код:
Eye eye1(100,100);
 mScene.addItem(&eye1);
то на view ничего не отрисовывается,
хотя если писаь mScene.addItemLine(10,10,100,100);
то линия появляется. Значит я как то неправильно унаследовался?
на вариант предложенный GreatSnake компилдятор ругался что невозможно перегрузить paint.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #3 : Июль 22, 2011, 10:45 »

на вариант предложенный GreatSnake компилдятор ругался что невозможно перегрузить paint.
Что-то не верится. Вот работающий код:
Код
C++ (Qt)
#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QGraphicsRectItem>
 
class CrossItem : public QGraphicsRectItem
{
public:
CrossItem( const QRectF& rect, QGraphicsItem* parent = 0 )
: QGraphicsRectItem ( rect, parent ) {}
virtual ~CrossItem() {}
 
protected:
void paint( QPainter* painter, const QStyleOptionGraphicsItem * option, QWidget * widget = 0 )
{
painter->drawLine( rect().topLeft(), rect().bottomRight() );
painter->drawLine( rect().topRight(), rect().bottomLeft() );
}
};
 
int main( int argc, char** argv )
{
QApplication app( argc, argv );
 
QGraphicsView gv;
QGraphicsScene scene;
 
gv.setScene( &scene );
 
CrossItem ci( QRectF( 0, 0, 200, 200 ) );
scene.addItem( &ci );
 
gv.show();
 
return app.exec();
}
Записан

Qt 5.11/4.8.7 (X11/Win)
borik120
Гость
« Ответ #4 : Июль 23, 2011, 17:44 »

Код:
#include "facewindow.h"
#include "eye.h"
#include "crossitem.h"


FaceWindow::FaceWindow()
{
   QWidget              mFaceWindow;

   QGraphicsPixmapItem *mpItem = new QGraphicsPixmapItem;
   QPixmap             *mPicture = new QPixmap;
   

CrossItem ci( QRectF( 0, 10, 400, 400 ) );


   mView.setScene(&mScene);


   mScene.addItem(&ci);





  mView.show();


}

у меня так, при включении выдает пустое  QGraphicsView, ни на что не ругается
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #5 : Июль 24, 2011, 12:41 »

Учи C++.
CrossItem создал на стеке.
Записан

Qt 5.11/4.8.7 (X11/Win)
borik120
Гость
« Ответ #6 : Июль 24, 2011, 22:16 »

Большое cпасибо за оказанную помощь.
создал в куче -  все работает. А не могли бы вы ответить мне на вопрос почему такие обьекты нужно создавать именно в куче.
потому что у стека: "последним пришел - первым ушел"?
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #7 : Июль 24, 2011, 22:39 »

потому что у стека: "последним пришел - первым ушел"?
Нет, потому что локальный объект удалится при выходе за область своей видимости. В данном случае при выходе из конструктора FaceWindow::FaceWindow.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.205 секунд. Запросов: 22.