Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: darkmacho от Декабрь 02, 2008, 16:29



Название: Контекст рисования
Отправлено: darkmacho от Декабрь 02, 2008, 16:29
Не подскажете что неправильно.У меня выходит просто пустое окно

Код:
QApplication app(argc, argv);    
QWidget win;
QPainter pip;
pip.begin(&win);
pip.setBrush(QBrush(Qt::red,Qt::DiagCrossPattern));
pip.setPen(QPen(Qt::blue,3,Qt::DashLine));
pip.drawRect((QRect(10,10,30,30)));
pip.end();
win.show();
   


Название: Re: Контекст рисования
Отправлено: BaltikS от Декабрь 02, 2008, 16:42
Уже обсуждалось, причём недавно... ПОИСК

Смысл в том что нужно унаследоваться от QWidget и переопределять PaintEvent и там хоть обрисуйся....


Название: Re: Контекст рисования
Отправлено: darkmacho от Декабрь 02, 2008, 17:30
Все понял а как там событие keyPressEvent переопределить
у меня такая ошибка выходит:
1>.\gaga.cpp(56) : error C2761: 'void Window::keyPressEvent(QKeyEvent *)' : member function redeclaration not allowed



Название: Re: Контекст рисования
Отправлено: BaltikS от Декабрь 02, 2008, 17:34
Нужен весь код класса Window, тяжело сообразить сходу в чём причина.


Название: Re: Контекст рисования
Отправлено: darkmacho от Декабрь 02, 2008, 17:44
Код:
class Window : public QLabel {

Q_OBJECT

private:
    QPoint  m_ptPosition;

protected:
    virtual void Window::mousePressEvent(QMouseEvent* pe)
    {
        m_ptPosition = pe->pos();
    }

    virtual void Window::mouseMoveEvent(QMouseEvent* pe)
    {
        move(pe->globalPos() - m_ptPosition);
    }
virtual void  keyPressEvent(QKeyEvent* e);


public:
    Window(QWidget* pwgt = 0)
: QLabel(pwgt,Qt::FramelessWindowHint | Qt::Window)
    {
    }

void paintEvent( QPaintEvent * );


};

void Window::paintEvent( QPaintEvent * e)
{ QPainter pip;
    pip.begin(this);
pip.drawPixmap(0,0,QPixmap("img/screen.png"));
pip.setBrush(QBrush(Qt::red,Qt::DiagCrossPattern));
pip.setPen(QPen(Qt::blue,3,Qt::DashLine));
pip.drawRect((QRect(10,10,30,30)));
pip.end();
}

void Window::keyPressEvent(QKeyEvent* e);
{ if(e->key()==Key_Return) exit(0);
}


Название: Re: Контекст рисования
Отправлено: BaltikS от Декабрь 02, 2008, 17:47
Код
C++ (Qt)
void Window::keyPressEvent(QKeyEvent* e);
точку с запятой убери в конце...


Название: Re: Контекст рисования
Отправлено: ритт от Декабрь 02, 2008, 18:04
в данном случае
Код:
{	QPainter pip;
    pip.begin(this);
//...
pip.end();

можно заменить на
Код:
{	QPainter pip(this);
//...


Название: Re: Контекст рисования
Отправлено: darkmacho от Декабрь 02, 2008, 18:12
Я "гений" А почему 'Key_Return' : undeclared identifier


Название: Re: Контекст рисования
Отправлено: darkmacho от Декабрь 02, 2008, 18:36
Если так написать QT::Key_Return то

Цитировать
1>gaga.obj : error LNK2001: unresolved external symbol "public: virtual struct QMetaObject const * __thiscall Window::metaObject(void)const " (?metaObject@Window@@UBEPBUQMetaObject@@XZ)
1>gaga.obj : error LNK2001: unresolved external symbol "public: virtual void * __thiscall Window::qt_metacast(char const *)" (?qt_metacast@Window@@UAEPAXPBD@Z)
1>gaga.obj : error LNK2001: unresolved external symbol "public: virtual int __thiscall Window::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@Window@@UAEHW4Call@QMetaObject@@HPAPAX@Z)
1>


Название: Re: Контекст рисования
Отправлено: pastor от Декабрь 02, 2008, 19:26
Ошибки линковки к QT::Key_Return неимеют никакого значение. У вас просто несченерился МОК. Сделайте qmake && make


Название: Re: Контекст рисования
Отправлено: darkmacho от Декабрь 02, 2008, 19:47
не помогло
Если написать просто Key_Return  - error C2065: 'Key_Return' : undeclared identifier
Если Qt:: Key_Return   - 1>gaga.obj : error LNK2001: unresolved external symbol "public: virtual struct QMetaObject const * __thiscall Window::metaObject(void)const " (?metaObject@Window@@UBEPBUQMetaObject@@XZ)
1>gaga.obj : error LNK2001: unresolved external symbol "public: virtual void * __thiscall Window::qt_metacast(char const *)" (?qt_metacast@Window@@UAEPAXPBD@Z)
1>gaga.obj : error LNK2001: unresolved external symbol "public: virtual int __thiscall Window::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@Window@@UAEHW4Call@QMetaObject@@HPAPAX@Z)

Код

Код:
#include <qapplication.h>
#include<qpixmap.h>
#include <qlabel.h>
#include <QMouseEvent>
#include<qwidget.h>
#include<qbitmap>
#include <qpainter.h>
class Window : public QLabel {

Q_OBJECT

private:
    QPoint  m_ptPosition;

protected:
    virtual void Window::mousePressEvent(QMouseEvent* pe)
    {
        m_ptPosition = pe->pos();
    }

    virtual void Window::mouseMoveEvent(QMouseEvent* pe)
    {
        move(pe->globalPos() - m_ptPosition);
    }



public:
    Window(QWidget* pwgt = 0)
: QLabel(pwgt,Qt::FramelessWindowHint | Qt::Window)
    {
    }

void paintEvent( QPaintEvent * );
void  keyPressEvent(QKeyEvent* e);

};

void Window::paintEvent( QPaintEvent * )
{ QPainter pip;
    pip.begin(this);
pip.drawPixmap(0,0,QPixmap("img/screen.png"));
pip.setBrush(QBrush(Qt::red,Qt::DiagCrossPattern));
pip.setPen(QPen(Qt::blue,3,Qt::DashLine));
pip.drawRect((QRect(10,10,30,30)));
pip.end();
}

void Window::keyPressEvent(QKeyEvent* e)
{ if(e->key()==Qt::Key_Return) exit(0);
}



// ----------------------------------------------------------------------
int main(int argc, char** argv)
{ QApplication app(argc, argv);   
Window win;
QPixmap pix("img/screen.png");
    win.setPixmap(pix);
win.setMask(pix.mask());
win.show();



    return app.exec();
}


Название: Re: Контекст рисования
Отправлено: darkmacho от Декабрь 02, 2008, 20:07
Опять ошибка надо убрать Q_OBJECT
 наследует то у QLabel


Название: Re: Контекст рисования
Отправлено: Hort от Декабрь 06, 2008, 01:16
Опять ошибка надо убрать Q_OBJECT
 наследует то у QLabel
а это зачем? Q_OBJECT - это не член класса, это макрос. если класс преднасначен для использования механизма сигналов и слотов - макрос Q_OBJECT обязателен


Название: Re: Контекст рисования
Отправлено: lit-uriy от Декабрь 06, 2008, 01:20
2 darkmacho, если нехочешь ходить по граблям, лучше сразу создавай класс в отдельной паре файлов h/cpp, а не в одном файле с функцией main.


Название: Re: Контекст рисования
Отправлено: BaltikS от Декабрь 06, 2008, 10:46
Так там ещё походу в конце main.cpp надо написать
Код
C++ (Qt)
#include "moc_xxxxx.cpp"
 


Название: Re: Контекст рисования
Отправлено: pastor от Декабрь 06, 2008, 16:45
Так там ещё походу в конце main.cpp надо написать
Код
C++ (Qt)
#include "moc_xxxxx.cpp"
 

+1.