Russian Qt Forum

Qt => Общие вопросы => Тема начата: darkmacho от Декабрь 02, 2008, 20:23



Название: keyPressEvent
Отправлено: darkmacho от Декабрь 02, 2008, 20:23
Как при нажатии какой-нибудь клавиши вывести картинку?Можно описать алгоритм в общих чертах?

Код:
void Window::keyPressEvent(QKeyEvent* e)
{    if(e->key()==Qt::Key_Space) yes=true;///Здесь что то нужно дописать и как товызвать paintEvent ?
///?????????????Как?

}



Название: Re: keyPressEvent
Отправлено: panAlexey от Декабрь 02, 2008, 20:34
update();


Название: Re: keyPressEvent
Отправлено: darkmacho от Декабрь 02, 2008, 21:05
Пример

Код:
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)));

if(yes)
{

pip.drawPixmap(0,0,QPixmap("img/1.png"));
//for(int i=1;i<=7;i++);
       //pip.drawPixmap(m[i][1],100,p[i]);
}
pip.end();
}

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

    if(e->key()==Qt::Key_Space)
{yes=true;
update();
}
}

Проблема в том что почему-то нельзя объявлять массив Pixmap p[maxn]; до обйявления виджета
виджета
///Здесь не проходит выше
....
Window win;
........
//Ниже вполне


Название: Re: keyPressEvent
Отправлено: ритт от Декабрь 03, 2008, 05:30
Проблема в том что почему-то нельзя объявлять массив Pixmap p[maxn]; до обйявления виджета
а что то за тип такой "Pixmap"?

///Здесь не проходит выше
....
Window win;
........
//Ниже вполне
это для меня осталось загадкой. мб это какая шифровка?
Цитировать
- а почему "Ы"?
- чтоб никто не догадался...


Название: Re: keyPressEvent
Отправлено: darkmacho от Декабрь 03, 2008, 08:49
Опять ступил ну конечно же QPixmap p[7];

1)
Код:
int main(int argc, char** argv)
{
.....
QApplication app(argc, argv);   
Window win;
QPixmap pix("img/screen.png");
QPixmap p[30];////Объявляю после виджета win;
...
}

2)
QPixmap p[30]; ////Объявляю до виджета win и main();
int main(int argc, char** argv)
{....
 QApplication app(argc, argv);   
   Window win;
      QPixmap pix("img/screen.png");
.....
}

Ошибка QPixmap:Must construct a QApplication before a QPaintDevice
выходит после компиляции в отдельном окне


Название: Re: keyPressEvent
Отправлено: BRE от Декабрь 03, 2008, 09:08
Опять ступил ну конечно же QPixmap p[7];

1)
Код:
int main(int argc, char** argv)
{
.....
QApplication app(argc, argv);   
Window win;
QPixmap pix("img/screen.png");
QPixmap p[30];////Объявляю после виджета win;
...
}

2)
Код:
QPixmap p[30]; ////Объявляю до виджета win и main();
int main(int argc, char** argv)
{....
 QApplication app(argc, argv);   
Window win;
QPixmap pix("img/screen.png");
.....
}
Ошибка QPixmap:Must construct a QApplication before a QPaintDevice
выходит после компиляции в отдельном окне
Qt тебе и говорит, что объекты QPixmap должны создаваться после того, как создаться обхект QApplication.
Почему бы тебе этот QPixmap p[7] не объявить в классе Window? А лучше сразу QList<QPixmap> p.


Название: Re: keyPressEvent
Отправлено: darkmacho от Декабрь 03, 2008, 09:52
Так выходит ошибка "отправлять не отправлять"


Название: Re: keyPressEvent
Отправлено: BRE от Декабрь 03, 2008, 09:58
Так выходит ошибка "отправлять не отправлять"
Какая ошибка? Нельзя создавать QPixmap до создания QApplication. За информацией в QAssistant.
Если все таки хочешь объявить массив QPixmap глобально, то объяви его как массив указателей:
QPixmap *p[7]; или QList<QPixmap*> p;
А заполняй его нужными значениями уже после создания экземпляра QApplication.



Название: Re: keyPressEvent
Отправлено: darkmacho от Декабрь 03, 2008, 10:22
Ну вот же

Код:
#include <qapplication.h>
#include<qpixmap.h>
#include <qlabel.h>
#include <QMouseEvent>
#include<qbitmap>
#include <qpainter.h>
bool yes=false;

QPixmap *p[7];

class Window : public QLabel {

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 * )
{ 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)));

if(yes)
{ pip.drawPixmap(0,0,QPixmap("img/1.png"));
}
pip.end();
}

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

    if(e->key()==Qt::Key_Space)
{yes=true;
update();
}
}



// ----------------------------------------------------------------------
int main(int argc, char** argv)
{ QApplication app(argc, argv);   
Window win;
QPixmap pix("img/screen.png");
qint32 m[30][30];
int t=40;
for(int y=1;y<=7;y++)
{m[y][1]=t;
t+=50;
}
p[1]->load("img/1.png");
p[2]->load("img/2.png");
p[3]->load("img/3.png");
p[4]->load("img/4.png");
p[5]->load("img/5.png");
p[6]->load("img/6.png");
p[7]->load("img/7.png");
win.setPixmap(pix);
win.setMask(pix.mask());
win.show();



    return app.exec();
}

Как нажимаю ctrl+f5 выходит ошибка:
Do you want to debug using the selected debugger?


Название: Re: keyPressEvent
Отправлено: BRE от Декабрь 03, 2008, 12:01
Код
C++ (Qt)
 
QPixmap *p[ 7 ];
 
int main(...)
{
   QApplication app(...);
   for( int i = 0; i < 7; ++i )
       p[ i ] = new QPixmap( name[ i ] );    // Создаем объект QPixmap
}
 
 

И еще по коду...
Индексация массивов в C/C++ начинается с 0.

IMHO Все это нужно скрыть в классе Window.


Название: Re: keyPressEvent
Отправлено: darkmacho от Декабрь 03, 2008, 12:15
все спасибо помогло