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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Смена вида окна  (Прочитано 5085 раз)
darkmacho
Гость
« : Февраль 08, 2009, 17:44 »

Возникла проблема со сменой вида окна.
Изначально окно имеет нестандартную форму(Картинка с прозрачными областями), после некоторых действий хочу заменить эту картинку на другую.Пробовал так.Знаю что неправильно! пока что весь код у меня в одном файле.класс окна window.
Итак в

Код
C++ (Qt)
main()
{window win;
win.setpixmap(картинка1);
win.setmask(картинка1);
win.show();
}

первая проблема это откуда взять ссылку на окно?Я там пробовал сначала после объявления класса window создать указатель
window *rt;
и в mainе приписать : rt=&win;
А потом в какой то функции rt->setpixmap(картинка2); rt->setmask(картинка2); и когда программа доходит до этого картинка искажается и все!

Как красиво решитьпроблему?
« Последнее редактирование: Февраль 08, 2009, 19:14 от pastor » Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #1 : Февраль 08, 2009, 17:50 »

>первая проблема это откуда взять ссылку на окно?
если внутри класса, то используй указатель this
Записан

Юра.
darkmacho
Гость
« Ответ #2 : Февраль 08, 2009, 17:57 »

1 проблема решена спасибо, но остается главная
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #3 : Февраль 08, 2009, 18:25 »

а в чем главная, я так и не понял. Что тебе мешает менять картинку? в какой момент она должна менятся.

П.С. почему из тебя информацию нужно щипцами тянуть, опиши задачу сразу?
Записан

Юра.
darkmacho
Гость
« Ответ #4 : Февраль 08, 2009, 18:36 »

когда пользователь нажимает пробел например!

bool yes=false;
Код
C++ (Qt)
main()
{window win;
win.setpixmap(картинка1);
win.setmask(картинка1);
win.show();
}
 
key_pressed()
{if(Пробел) то
{yes=true;
 
rt->setpixmap(картинка2); rt->setmask(картинка2);
}
}
 
painted()
{
if(!yes) draw(картинка1);
else draw(картинка2)
 
}


//Пользуйся тэгом КОД и форматируй нормально исходный код!
« Последнее редактирование: Февраль 08, 2009, 19:15 от pastor » Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #5 : Февраль 08, 2009, 19:24 »

а где объявление и тело типа window?
там нужно нажите кнопки обрабатывать, там и картинку менять.
см. в сторону QAction
Записан

Юра.
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #6 : Февраль 08, 2009, 19:26 »

при таком коде я сильно сомневаюсь, что первая проблема решена. Где ты например применил указатель this, можешь код показать?
Записан

Юра.
darkmacho
Гость
« Ответ #7 : Февраль 08, 2009, 20:08 »

эхххх все-таки

Код
C++ (Qt)
#include <qapplication.h>
#include<qpixmap.h>
#include <qlabel.h>
#include<qmovie.h>
#include <QMouseEvent>
#include<qbitmap>
#include <qpainter.h>
#include<qtime>
#include<vector>
#include<list>
#include<qlist>
bool yes=false;
 
 
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 Window::mousePressEvent(QMouseEvent* pe);
 
 
   virtual void  keyPressEvent(QKeyEvent* e);
 
public:
 
 
   Window(QWidget* pwgt = 0)
               : QLabel(pwgt,Qt::FramelessWindowHint | Qt::Window)
   {
   }
 
 
 
void paintEvent( QPaintEvent * );
void NewPix();
int who_is,who_isx,who_isy;
QPixmap *p[20];
QMovie *pp[20];
QPixmap *ball;
QPoint m[6][5];
int who[6][5];
int sost[6][5];
QList <int> kept;
QList <int>:: iterator er;
QLabel lbl;
int schet;
};
 
Window *rt;
 
void Window::NewPix()
{
int temp;
schet=0;
       qint32 tx=80,ty=100;
 
       for(qint32 y=0;y<5;y++)
       {
               for(qint32 x=0;x<6;x++)
               {m[x][y].setX(tx);
                m[x][y].setY(ty);
                tx+=100;
               }
               tx=80;
       ty+=110;
       }
QTime time;
srand(time.second());
 
for(int i=0;i<15;i++)
{temp=rand()%15;
       kept.append(temp);
       kept.append(temp);
}
 
for(int y=0;y<5;y++)
       {
               for(int x=0;x<6;x++)
               { temp=rand()%kept.count();
                       who[x][y]=kept.at(temp);
                       kept.removeAt(temp);
                       //kept.remove(temp);
                       //schet++;
               }
}
 
//if(kept.count==0) exit(0);
 
p[0]= new QPixmap(  ":img/1.PNG");
p[1]= new QPixmap(  ":img/2.PNG");
p[2]= new QPixmap(  ":img/3.PNG");
p[3]= new QPixmap(  ":img/4.PNG");
p[4]= new QPixmap(  ":img/5.PNG");
p[5]= new QPixmap(  ":img/6.PNG");
p[6]= new QPixmap(  ":img/7.PNG");
p[7]= new QPixmap(  ":img/8.PNG");
p[8]= new QPixmap(  ":img/9.PNG");
p[9]= new QPixmap(  ":img/10.PNG");
p[10]= new QPixmap(  ":img/11.PNG");
p[11]= new QPixmap(  ":img/12.PNG");
p[12]= new QPixmap(  ":img/13.PNG");
p[13]= new QPixmap(  ":img/14.PNG");
p[14]= new QPixmap(  ":img/15.PNG");
 
ball=new QPixmap(  ":img/17.PNG");
 
 
 
 
for(int y=0;y<5;y++)
                       for(int x=0;x<6;x++)
             sost[x][y]=0;
 
who_is=-1;
who_isx=-1;
who_isy=-1;
}
 
 
void Window::mousePressEvent(QMouseEvent* pe)
   {//exit(0);
               int h=pe->x(),t=pe->y();
for(qint32 y=0;y<5;y++)
for(qint32 x=0;x<6;x++)
{
 
       if(m[x][y].x()<h && m[x][y].x()+75>h && m[x][y].y()<t && m[x][y].y()+100>t)
       if(sost[x][y]!=2)
       {
               if (who_is==who[x][y]){schet+=5;sost[x][y]=2; sost[who_isx][who_isy]=2;sost[x][y]==2; who_is=-1; update();}
       else
               if(who_is==-1) {who_is=who[x][y];who_isx=x;who_isy=y;sost[x][y]=1; update();}
               else
                       if(who_is!=-1 && who_is!=who[x][y])
                       {who_is=-1;sost[who_isx][who_isy]=0;update(); }
       }
}
 
   }
 
 
void Window::paintEvent( QPaintEvent * )
{ QPainter pip;
 
QString st=QString::number(schet);
 
       pip.begin(this);
 
 
       pip.setFont(QFont("Times",25,QFont::Normal));
       if(!yes)
       {//exit(0);
       pip.drawPixmap(0,0,QPixmap(":img/screen6.png"));
       pip.drawText(800,100,st);
       }
       else
       {//exit(0);
        pip.drawPixmap(0,0,QPixmap(":img/screen2.png"));
       pip.drawText(800,100,st);
       }
 
if(yes)
{for(qint32 y=0;y<5;y++)
for(qint32 x=0;x<6;x++)
 
if(sost[x][y]==0) pip.drawPixmap(m[x][y],*ball);
else
if(sost[x][y]==1)
pip.drawPixmap(m[x][y],*p[who[x][y]]);
 
}
       pip.end();
}
 
 
 
void Window::keyPressEvent(QKeyEvent* e)
{ if(e->key()==Qt::Key_Return) exit(0);
 
   if(e->key()==Qt::Key_Space)
       {yes=true;
       //exit(0);
   // *rt->setMask(QPixmap(":img/screen2.png"));
       //rt->clearMask();
      // rt->clear();
      // rt->setPixmap(QPixmap(":img/screen2.png"));
       //rt->setMask(QPixmap(":img/screen2.png"));
       this->setPixmap(QPixmap(":img/screen2.png"));
       this->setMask(QPixmap(":img/screen2.png"));
       update();
       }
}
 
 
 
// ----------------------------------------------------------------------
int main(int argc, char** argv)
{ QApplication app(argc, argv);
       Window win;
       rt=&win;
               QPixmap pix(":img/screen6.png");
 
win.NewPix();
win.setWindowTitle("My games");
win.move(30,30);
       win.setPixmap(pix);
       win.setMask(pix.mask());
       //win.setBaseSize(1500,1500);
       win.setFixedHeight(800);
       win.setFixedWidth(1000);
       win.show();
 
 
 
   return app.exec();
}
« Последнее редактирование: Февраль 08, 2009, 20:26 от pastor » Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #8 : Февраль 08, 2009, 21:11 »

Первое что бросилось в глаза, кроме форматирования:
в функции main:
rt=&win;

совершенно бесполезная вещь
Записан

Юра.
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #9 : Февраль 08, 2009, 22:31 »

Вообщем ковырятся в твоем коде неприятно. Тебе уже рекомендовалось проводить эксперименты с классами в отдельных файлах.

Вот тебе заготовка, сохрани ее и будешь пользоваться в дальнейшем, ну и наполни ее свои кодом:
pro-файл
Код:
TEMPLATE = app
TARGET = tst

# Input
HEADERS += class.h
SOURCES += class.cpp
SOURCES += main.cpp


#=========== Config ================
CONFIG += debug_and_release build_all



DESTDIR     = ./build
OBJECTS_DIR = ./build/obj
UI_DIR      = ./build/uic
MOC_DIR     = ./build/moc
RCC_DIR = ./build/rcc


CONFIG (debug, debug|release) {
OBJECTS_DIR  = $$join(OBJECTS_DIR,,,d)
TARGET       = $$join(TARGET,,,d)
CONFIG      += console
}

main.cpp
Код:
#include <QtGui>
#include "class.h"

int main(int argc, char** argv)
{
  QApplication app(argc, argv);

/* Вариант первый без компоновщика,
   размер виджета задем при создании экземпляра класса

  MyWidget wnd;

wnd.resize(200, 200);
wnd.show();
*/


/* ========================================================= */

/* Вариант второй помещаем наш виджет в родительский
   с помощью компоновщика, размер виджета компоновщик узнает
   у нашего виджета с помощью MyWidget::minimumSizeHint()*/
  QWidget    wnd;
  MyWidget *wgt;
  QVBoxLayout *lay;

wgt = new MyWidget(&wnd);
lay = new QVBoxLayout(&wnd);

lay->addWidget(wgt);
wnd.setLayout(lay);

// размер родителя необязательно задавать, т.к.
// так как у нашего виджета определена функция MyWidget::minimumSizeHint()
// и она не даст компоновщику сделать его меньше.
//wnd.resize(200, 200);
wnd.show();

return app.exec();
}
здесь два варианта отображения самописанного виджета, закоментировав/разкоментировав нужный можешь посмотреть на поведение.

class.h
Код:
#ifndef CLASS_H
#define CLASS_H

#include <QLabel>

class QAction;

class MyWidget: public QLabel
{
    Q_OBJECT

public:
    MyWidget(QWidget *parent = 0);

private:
QAction *act_kick;
QSize my_size;

private:
QSize sizeHint();
virtual QSize minimumSizeHint () const;

private slots:
void slotKick(bool);

};

#endif //CLASS_H

class.cpp
Код:
#include <QtGui>
#include "class.h"

MyWidget::MyWidget(QWidget *parent):QLabel(parent), my_size(QSize(200, 200))
{
act_kick = new QAction(this);
act_kick->setShortcut(Qt::Key_Space);// задаем горячую клавишу (см. enum Qt::Key в qt.html)

addAction(act_kick);

connect(act_kick, SIGNAL(triggered(bool)),
this,     SLOT(slotKick(bool)));

}

/*
 * слот сработки действия по горячей клавише
 */
void MyWidget::slotKick(bool checked)
{
qDebug() << "slotKick =" << checked;


}

/*
 * Минимальный размер нашего виджета
 */
QSize MyWidget::minimumSizeHint () const
{
// если надо то можно размер вычислять
return QSize(100, 100);
}

/*
 * Желаемый размер нашего виджета
 */
QSize MyWidget::sizeHint()
{
// если надо то можно размер вычислять
return my_size;
}
Вот в слоте и производи действия по смене картинки.

собирай в консоли так:
Код:
qmake
make
затем запусти файл tstd.exe (отладочная версия) нажимай клавишу "Пробел" и увидешь в консоли текст, который выводится в нашем слоте.


П.С. Админам, нельзя ли сделать так, чтобы размер табуляции был не 8, а 4 позиции, в тэге код?
Записан

Юра.
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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