Название: Смена вида окна
Отправлено: 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); и когда программа доходит до этого картинка искажается и все! Как красиво решитьпроблему?
Название: Re: Смена вида окна
Отправлено: lit-uriy от Февраля 08, 2009, 17:50
>первая проблема это откуда взять ссылку на окно? если внутри класса, то используй указатель this
Название: Re: Смена вида окна
Отправлено: darkmacho от Февраля 08, 2009, 17:57
1 проблема решена спасибо, но остается главная
Название: Re: Смена вида окна
Отправлено: lit-uriy от Февраля 08, 2009, 18:25
а в чем главная, я так и не понял. Что тебе мешает менять картинку? в какой момент она должна менятся.
П.С. почему из тебя информацию нужно щипцами тянуть, опиши задачу сразу?
Название: Re: Смена вида окна
Отправлено: darkmacho от Февраля 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) } //Пользуйся тэгом КОД и форматируй нормально исходный код!
Название: Re: Смена вида окна
Отправлено: lit-uriy от Февраля 08, 2009, 19:24
а где объявление и тело типа window? там нужно нажите кнопки обрабатывать, там и картинку менять. см. в сторону QAction
Название: Re: Смена вида окна
Отправлено: lit-uriy от Февраля 08, 2009, 19:26
при таком коде я сильно сомневаюсь, что первая проблема решена. Где ты например применил указатель this, можешь код показать?
Название: Re: Смена вида окна
Отправлено: darkmacho от Февраля 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(); }
Название: Re: Смена вида окна
Отправлено: lit-uriy от Февраля 08, 2009, 21:11
Первое что бросилось в глаза, кроме форматирования: в функции main: rt=&win;
совершенно бесполезная вещь
Название: Re: Смена вида окна
Отправлено: lit-uriy от Февраля 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; }
Вот в слоте и производи действия по смене картинки. собирай в консоли так: затем запусти файл tstd.exe (отладочная версия) нажимай клавишу "Пробел" и увидешь в консоли текст, который выводится в нашем слоте. П.С. Админам, нельзя ли сделать так, чтобы размер табуляции был не 8, а 4 позиции, в тэге код?
|