Название: Создание класса
Отправлено: 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). мне кажется я что то сильно недогоняю относительно работы с классами) может есть более простой способ реализовать это? буду рад любой подсказке:)
Название: Re: Создание класса
Отправлено: GreatSnake от Июль 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() ); } };
Название: Re: Создание класса
Отправлено: borik120 от Июль 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.
Название: Re: Создание класса
Отправлено: GreatSnake от Июль 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(); }
Название: Re: Создание класса
Отправлено: borik120 от Июль 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, ни на что не ругается
Название: Re: Создание класса
Отправлено: GreatSnake от Июль 24, 2011, 12:41
Учи C++. CrossItem создал на стеке.
Название: Re: Создание класса
Отправлено: borik120 от Июль 24, 2011, 22:16
Большое cпасибо за оказанную помощь. создал в куче - все работает. А не могли бы вы ответить мне на вопрос почему такие обьекты нужно создавать именно в куче. потому что у стека: "последним пришел - первым ушел"?
Название: Re: Создание класса
Отправлено: LisandreL от Июль 24, 2011, 22:39
потому что у стека: "последним пришел - первым ушел"? Нет, потому что локальный объект удалится при выходе за область своей видимости. В данном случае при выходе из конструктора FaceWindow::FaceWindow.
|