Russian Qt Forum

Qt => Вопросы новичков => Тема начата: soulsaver от Декабрь 06, 2012, 09:18



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


Название: Re: Не могу подгрузить 2ю QPixmap или QImage
Отправлено: carrygun от Декабрь 06, 2012, 10:18
Слишком мало информации. В выводе приложения хотябы что написано? Ну и подебагай чтоли. И очень ли нужен пиксмап в куче? Может лучше в стеке сделать?


Название: Re: Не могу подгрузить 2ю QPixmap или QImage
Отправлено: soulsaver от Декабрь 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

Стек. Я же с файла ресурсов тяну это все, вшитого в проэкт, стеком придется тянуть из отдельных файлов, как-то не красиво таскать с программой кучу имаджей )


Название: Re: Не могу подгрузить 2ю QPixmap или QImage
Отправлено: carrygun от Декабрь 06, 2012, 10:47
Запусти отладку по F5, скажи хотябы с какой ошибкой завалилось и куда указало.
Как минимум попробуй все почистить и переqmake'ать, а потом пересобрать.

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

P.S. используй QPoint вместо всяких странных конструкций типа "int intWndLostNowPos [1];"


Название: Re: Не могу подгрузить 2ю QPixmap или QImage
Отправлено: Sancho_s_rancho от Декабрь 06, 2012, 10:59
Код:
int intWndLostNowPos [1];
intWndLostNowPos[0]=event->x();
intWndLostNowPos[1]=event->y();
Дальше не смотрел....


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


Название: Re: Не могу подгрузить 2ю QPixmap или QImage
Отправлено: soulsaver от Декабрь 06, 2012, 11:09
Код:
int intWndLostNowPos [1];
intWndLostNowPos[0]=event->x();
intWndLostNowPos[1]=event->y();
Дальше не смотрел....
Лень мне было 2 переменные создавать ). А с классами qt я не всеми знаком). Вот carrygun подсказал, теперь буду пользовать )


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


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

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


Название: Re: Не могу подгрузить 2ю QPixmap или QImage
Отправлено: carrygun от Декабрь 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);
...
 


Название: Re: Не могу подгрузить 2ю QPixmap или QImage
Отправлено: Sancho_s_rancho от Декабрь 06, 2012, 11:24
"Ну 2 ) Индексы в массиве начинаются с 0. Тоесть 0,1. Или что-то не так? )"

Ну 1


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

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

Количество элементов в массиве - натуральное число.


Название: Re: Не могу подгрузить 2ю QPixmap или QImage
Отправлено: soulsaver от Декабрь 06, 2012, 11:34
Ну по правилу, но их же 2, зачем создавать массив [2] если один из реально существующих элементов будет не востребован, я если честно не пойму. ) Если у вас есть время можете обьяснить ) Почему то что я сделал не правильно? ) Мне будет действительно интересно)


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


Название: Re: Не могу подгрузить 2ю QPixmap или QImage
Отправлено: carrygun от Декабрь 06, 2012, 11:42
Ну по правилу, но их же 2, зачем создавать массив [2] если один из реально существующих элементов будет не востребован, я если честно не пойму. ) Если у вас есть время можете обьяснить ) Почему то что я сделал не правильно? ) Мне будет действительно интересно)

Размер массива - натуральное число, то есть 1..N, числа которыми вы ведет счет в нормальной жизни. Индексы же идут 0..N-1.
Вообще по чистой случайности у тебя ничего не сломалось.


Название: Re: Не могу подгрузить 2ю QPixmap или QImage
Отправлено: soulsaver от Декабрь 06, 2012, 11:50
аааа, воткнул ))) спасибо )). это он динамически шоль элемент еще один создал, спасибо ))


Название: Re: Не могу подгрузить 2ю QPixmap или QImage
Отправлено: carrygun от Декабрь 06, 2012, 11:52
аааа, воткнул ))) спасибо )). это он динамически шоль элемент еще один создал, спасибо ))

Нет, ты просто испортил участок памяти своими данными.


Название: Re: Не могу подгрузить 2ю QPixmap или QImage
Отправлено: Sancho_s_rancho от Декабрь 06, 2012, 11:52
аааа, воткнул ))) спасибо )). это он динамически шоль элемент еще один создал, спасибо ))
Нет. ты просто записал данные за границы массива и твоя программа может рухнуть в любой момент.


Название: Re: Не могу подгрузить 2ю QPixmap или QImage
Отправлено: soulsaver от Декабрь 06, 2012, 13:07
Ааа ) Короче типо система не знает об этой вылезшей части, и при любом запросе куска оперативы другой программой или еще чего, система без зазрения совести отдаст эту часть оперативы вместе с моим куском, и он будет перезаписан )). А интересно таким образом я могу перезаписать ту часть оперативы которую например щас винамп занимает и таким образом положить его? или все равно расширятся будет только на незанятое пространство оперы? )


Название: Re: Не могу подгрузить 2ю QPixmap или QImage
Отправлено: Igors от Декабрь 06, 2012, 13:39
Ааа ) Короче типо система не знает об этой вылезшей части, и при любом запросе куска оперативы другой программой или еще чего, система без зазрения совести отдаст эту часть оперативы вместе с моим куском, и он будет перезаписан )). А интересно таким образом я могу перезаписать ту часть оперативы которую например щас винамп занимает и таким образом положить его? или все равно расширятся будет только на незанятое пространство оперы? )
Не сможете, адресное пространство др процесса недоступно. В рамках процесса память выделяется блоками, каждый имеет заголовок. Обычно запись за границы массива портит заголовок следующего, цепь блоков разрушена, и вылет происходит в любой момент (часто далеко от места ошибки).

Нет ничего плохого что Вы сходу получили окно которое таскается и.т.п. Беда в том что люди часто переоценивают эти успехи, мол, "вот уже и программу написал" :) Но без знания языка все это оказывается "карточным домиком"


Название: Re: Не могу подгрузить 2ю QPixmap или QImage
Отправлено: soulsaver от Декабрь 06, 2012, 13:57
Спасибо ) дома попишу в консоли из учебников с или с++)). Кстати имеет смысл вообще с учить? или можно сразу с++?


Название: Re: Не могу подгрузить 2ю QPixmap или QImage
Отправлено: Igors от Декабрь 06, 2012, 14:14
Кстати имеет смысл вообще с учить? или можно сразу с++?
Цитировать
как программисты выносят мусор

1. программист на C
Берет ведро за ручку, идет на мусорник, открывает контейнер, высыпает мусор, закрывает контейнер,
возвращается с пустым ведром. Если контейнер был переполнен или его не удалось открыть,
возвращается назад с полным ведром.

2. программист на C++
Говорит мусору - "вынеси себя на мусорник". Если мусор не слушается, выбрасывает его из окна.
Это конечно шутка, но IMO очень удачная. В языке С трудно сачкануть, все должно быть сделано аккуратно и скрупулезно. А вот в С++ пожалуйста. А если уж дело доходит до STL - широчайший простор для говнокодинга. А пошли в ход паттерны - то все, ховайся  :)


Название: Re: Не могу подгрузить 2ю QPixmap или QImage
Отправлено: Bepec от Декабрь 06, 2012, 15:04
Igors маленькая поправка - можно вообще свалить всю систему нафиг, несмотря на разделение страниц. Но это скорее заслуга самой системы + талант программиста.


Название: Re: Не могу подгрузить 2ю QPixmap или QImage
Отправлено: LisandreL от Декабрь 06, 2012, 16:19
Не сможете, адресное пространство др процесса недоступно.
ArtMoney и Cheat Engine смотрят на вас с удивлением. ;)
Да, я понимаю, что там всё далеко не так просто.


Название: Re: Не могу подгрузить 2ю QPixmap или QImage
Отправлено: Igors от Декабрь 06, 2012, 16:32
ArtMoney и Cheat Engine смотрят на вас с удивлением. ;)
Никогда не слышал ни об одном :) Более простой пример - отладчик(и). А вот забивать начинающему голову не следует. Услышав что есть исключения он понимает что правила учить необязательно - и результат печален


Название: Re: Не могу подгрузить 2ю QPixmap или QImage
Отправлено: soulsaver от Декабрь 06, 2012, 16:46
Офигенный форум(люди тут находящиеся)) Надо тут пожить немного )


Название: Re: Не могу подгрузить 2ю QPixmap или QImage
Отправлено: Alex Custov от Декабрь 06, 2012, 16:50
Igors маленькая поправка - можно вообще свалить всю систему нафиг, несмотря на разделение страниц. Но это скорее заслуга самой системы + талант программиста.

Не нужно особого таланта, простейшие атаки на ресурсы системы - форк бомбы и т.п.


Название: Re: Не могу подгрузить 2ю QPixmap или QImage
Отправлено: Bepec от Декабрь 06, 2012, 20:35
У меня где то программа лежит, убивающая любой комп с подключенным к нему USB COM портом :)

А ArtMoney и CheatEngine используют внедрение в чужое адресное пространство. Специальными функциями системы. А вот просто так без winApi и функций createRemoteThread и ещё одной, ничего не получится :)