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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Не могу подгрузить 2ю QPixmap или QImage  (Прочитано 12838 раз)
soulsaver
Гость
« : Декабрь 06, 2012, 09:18 »

Здравствуйте, дело обстоит так, есть проэкт, создал в нем класс, переопределенный от QMainWindow, создаю в нем QPixmap, подгружаю в него картинку с альфа каналом, задаю маску QMainWindow в resizeEvent, рисую на этом же виджете эту картинку в paintEvent, получается окно по форме киртинки). создаю второй класс, переопределяю его от QWidget но как только в конструкторе класса подгружаю картинку
Код:
imgBtnClose = new QPixMap(":/wndMain/btnClose.png");
компиляция проходит нормально, но при запуске происходит крах программы. Комментирую строку, и проэкт запускается нормально.. из второго виджета хочу сделать кнопочку )) и дать ему parent первого. Читал что QPixmap гонит в потоках, предлагают использовать QImage, пробовал, таже история. Помогите плиз )
Записан
carrygun
Гость
« Ответ #1 : Декабрь 06, 2012, 10:18 »

Слишком мало информации. В выводе приложения хотябы что написано? Ну и подебагай чтоли. И очень ли нужен пиксмап в куче? Может лучше в стеке сделать?
Записан
soulsaver
Гость
« Ответ #2 : Декабрь 06, 2012, 10:35 »

cMainWindow.h (этот класс отрабатывает нормально, появляется красивая форма, таскается и т.д)

Код:
#ifndef CMAINWINDOW_H
#define CMAINWINDOW_H
#include <QMainWindow>
#include <QtGui>
class cMainWindow:public QMainWindow{
    Q_OBJECT
public:
    cMainWindow(QWidget *parent=0);
    ~cMainWindow();
private:
    virtual void resizeEvent(QResizeEvent *event);
    virtual void paintEvent(QPaintEvent *event);
    virtual void mousePressEvent(QMouseEvent *event);
    virtual void mouseReleaseEvent(QMouseEvent *event);
    virtual void mouseMoveEvent(QMouseEvent *event);
    int intWndLostNowPos [1];
    bool wndDrugOrNO;
    QPixmap *pixMainFon;
};

#endif // CMAINWINDOW_H

cMainWindow.cpp

Код:
#include "cMainWindow.h"
#include <QBitmap>
#include <QPainter>
cMainWindow::cMainWindow(QWidget *parent):QMainWindow(parent){
    pixMainFon=new QPixmap(":/wndMain/wndMain.png");
    this->setGeometry(pixMainFon->rect());

}

cMainWindow::~cMainWindow(){

}

void cMainWindow::resizeEvent(QResizeEvent *event){
    this->setMask(pixMainFon->mask());
}

void cMainWindow::paintEvent(QPaintEvent *event){
    QRegion paintWndMainRegion(pixMainFon->rect());
    QPainter painter(this);
    painter.setClipRegion(paintWndMainRegion);
    painter.drawPixmap(pixMainFon->rect(),*pixMainFon);
}

void cMainWindow::mousePressEvent(QMouseEvent *event){
wndDrugOrNO=true;
intWndLostNowPos[0]=event->x();
intWndLostNowPos[1]=event->y();
}

void cMainWindow::mouseReleaseEvent(QMouseEvent *event){
wndDrugOrNO=false;
}

void cMainWindow::mouseMoveEvent(QMouseEvent *event){
    //**********
    if (wndDrugOrNO){
        if (event->x()>intWndLostNowPos[0]){
            this->move(this->x()+(event->x()-intWndLostNowPos[0]),this->y());
        }
        if (event->x()<intWndLostNowPos[0]){
            this->move(this->x()-(intWndLostNowPos[0]-event->x()),this->y());
        }
        if (event->y()>intWndLostNowPos[1]){
            this->move(this->x(),this->y()+(event->y()-intWndLostNowPos[1]));
        }
        if (event->y()<intWndLostNowPos[1]){
            this->move(this->x(),this->y()-(intWndLostNowPos[1]-event->y()));
        }
    }
    //**********
}

cMainCloseButton.h
Классу рвет башку и он ломает всю программу.

Код:
#ifndef CMAINCLOSEBUTTON_H
#define CMAINCLOSEBUTTON_H
#include <QWidget>
#include <QtGui>
class cMainCloseButton:public QWidget{
    Q_OBJECT
public:
    cMainCloseButton(QWidget *parent=0);
    ~cMainCloseButton();
private:
    virtual void resizeEvent(QResizeEvent *event);
    virtual void paintEvent(QPaintEvent *event);
    QImage *imgBtnClose;
};

#endif // CMAINCLOSEBUTTON_H

cMainCloseButton.cpp

Код:
#include "cMainCloseButton.h"
#include <QPainter>
#include <QImage>
cMainCloseButton::cMainCloseButton(QWidget *parent):QWidget(parent){
   imgBtnClose = new QImage(":/wndMain/btnClose.png"); //Вот это кладет все, закомментируешь и все пучком )
}


cMainCloseButton::~cMainCloseButton(){

}

void cMainCloseButton::resizeEvent(QResizeEvent *event){
   //this->setMask(imgBtnClose.mask());
}

void cMainCloseButton::paintEvent(QPaintEvent *event){
   // QRegion btnCloseRegion(imgBtnClose.rect());
   // QPainter painter(this);
   // painter.setClipRegion(btnCloseRegion);
   // painter.drawPixmap(imgBtnClose.rect(),&imgBtnClose);
}

Запускается D:\QT_Project\ForWork\debug\ForWork.exe...
Программа неожиданно завершилась.
D:\QT_Project\ForWork\debug\ForWork.exe завершился с кодом 62097

Стек. Я же с файла ресурсов тяну это все, вшитого в проэкт, стеком придется тянуть из отдельных файлов, как-то не красиво таскать с программой кучу имаджей )
Записан
carrygun
Гость
« Ответ #3 : Декабрь 06, 2012, 10:47 »

Запусти отладку по F5, скажи хотябы с какой ошибкой завалилось и куда указало.
Как минимум попробуй все почистить и переqmake'ать, а потом пересобрать.

По поводу кучи и стека. Не лучше ли создавать объект QPixmap там, где надо и не использовать указатель?

P.S. используй QPoint вместо всяких странных конструкций типа "int intWndLostNowPos [1];"
« Последнее редактирование: Декабрь 06, 2012, 10:50 от carrygun » Записан
Sancho_s_rancho
Гость
« Ответ #4 : Декабрь 06, 2012, 10:59 »

Код:
int intWndLostNowPos [1];
intWndLostNowPos[0]=event->x();
intWndLostNowPos[1]=event->y();
Дальше не смотрел....
Записан
soulsaver
Гость
« Ответ #5 : Декабрь 06, 2012, 11:05 »

Ужааас... Очистка проэкта и мейк решил проблему, все заработало. уже напарывался на такое же, с Q_OBJECT, а тут не додумался блин, извините за беспечность ((. Спасибо большое за советы, исправлюсь ).
А на счет того если я например обьявлю QPixmap в теле конструктора(когда она мне понадобится) то я же не смогу достучатся до нее из другой процедуры, например paintEvent. Или можно как-то даже в процедуре обьявить чтоб весь класс видел? Еще раз большое спасибо )
Записан
soulsaver
Гость
« Ответ #6 : Декабрь 06, 2012, 11:09 »

Код:
int intWndLostNowPos [1];
intWndLostNowPos[0]=event->x();
intWndLostNowPos[1]=event->y();
Дальше не смотрел....
Лень мне было 2 переменные создавать ). А с классами qt я не всеми знаком). Вот carrygun подсказал, теперь буду пользовать )
Записан
Sancho_s_rancho
Гость
« Ответ #7 : Декабрь 06, 2012, 11:11 »

Код:
int intWndLostNowPos [1];
intWndLostNowPos[0]=event->x();
intWndLostNowPos[1]=event->y();
Дальше не смотрел....
Лень мне было 2 переменные создавать ). А с классами qt я не всеми знаком). Вот carrygun подсказал, теперь буду пользовать )
Проблема в том, что вы языка не знаете, а какие-то Qt пытаетесь изучать. Даю подсказку: на сколько элементов создан массив?
Записан
soulsaver
Гость
« Ответ #8 : Декабрь 06, 2012, 11:22 »

Код:
int intWndLostNowPos [1];
intWndLostNowPos[0]=event->x();
intWndLostNowPos[1]=event->y();
Дальше не смотрел....
Лень мне было 2 переменные создавать ). А с классами qt я не всеми знаком). Вот carrygun подсказал, теперь буду пользовать )
Проблема в том, что вы языка не знаете, а какие-то Qt пытаетесь изучать. Даю подсказку: на сколько элементов создан массив?

Ну 2 ) Индексы в массиве начинаются с 0. Тоесть 0,1. Или что-то не так? )
Записан
carrygun
Гость
« Ответ #9 : Декабрь 06, 2012, 11:23 »

Я бы на твоем месте в хедере завел бы приватный QPixmap, допустим m_pixmap, передавал бы его в конструктор класса, а потом уже бы использовал в рисовалках.

Код
C++ (Qt)
...
cMainCloseButton(QWidget *parent=0, const QPixmap &pix = QPixmap());
...
cMainCloseButton::cMainCloseButton(QWidget *parent, QPixmap &pix):QWidget(parent){
   m_pixmap = pix;
}
...
painter.drawPixmap(rect(), m_pixmap);
...
 
Записан
Sancho_s_rancho
Гость
« Ответ #10 : Декабрь 06, 2012, 11:24 »

"Ну 2 ) Индексы в массиве начинаются с 0. Тоесть 0,1. Или что-то не так? )"

Ну 1
Записан
carrygun
Гость
« Ответ #11 : Декабрь 06, 2012, 11:25 »

Код:
int intWndLostNowPos [1];
intWndLostNowPos[0]=event->x();
intWndLostNowPos[1]=event->y();
Дальше не смотрел....
Лень мне было 2 переменные создавать ). А с классами qt я не всеми знаком). Вот carrygun подсказал, теперь буду пользовать )
Проблема в том, что вы языка не знаете, а какие-то Qt пытаетесь изучать. Даю подсказку: на сколько элементов создан массив?

Ну 2 ) Индексы в массиве начинаются с 0. Тоесть 0,1. Или что-то не так? )

Количество элементов в массиве - натуральное число.
Записан
soulsaver
Гость
« Ответ #12 : Декабрь 06, 2012, 11:34 »

Ну по правилу, но их же 2, зачем создавать массив [2] если один из реально существующих элементов будет не востребован, я если честно не пойму. ) Если у вас есть время можете обьяснить ) Почему то что я сделал не правильно? ) Мне будет действительно интересно)
Записан
Sancho_s_rancho
Гость
« Ответ #13 : Декабрь 06, 2012, 11:38 »

Ну по правилу, но их же 2, зачем создавать массив [2] если один из реально существующих элементов будет не востребован, я если честно не пойму. ) Если у вас есть время можете обьяснить ) Почему то что я сделал не правильно? ) Мне будет действительно интересно)
Написав int a[1] вы объявляете массив целых, состоящий из одного элемента. И теперь вы можете делать только что-то вроде a[0] = 123
Если вам надо массив из двух элементов - вы и должны объявить массив из 2-х элементов
« Последнее редактирование: Декабрь 06, 2012, 11:40 от Sancho_s_rancho » Записан
carrygun
Гость
« Ответ #14 : Декабрь 06, 2012, 11:42 »

Ну по правилу, но их же 2, зачем создавать массив [2] если один из реально существующих элементов будет не востребован, я если честно не пойму. ) Если у вас есть время можете обьяснить ) Почему то что я сделал не правильно? ) Мне будет действительно интересно)

Размер массива - натуральное число, то есть 1..N, числа которыми вы ведет счет в нормальной жизни. Индексы же идут 0..N-1.
Вообще по чистой случайности у тебя ничего не сломалось.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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