Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Общие вопросы _ А какие вобще сигналы ловятся слотами?

Автор: Don 30.4.2008, 21:37

А какие вобще сигналы ловятся слотами?
Я хотел к примеру, чтоб по нажатию кнопки на Label менялся шрифт текста, но ничего не получилось.

Автор: Litkevich Yuriy 30.4.2008, 22:15

напиши свой слот, который меняет шрифт, соедени его с сигналом кнопки и усё

Автор: Don 1.5.2008, 23:06

class Life : public QWidget 
{
    Q_OBJECT
public:
    Life(QWidget *parent = 0);
protected:
    virtual void paintEvent(QPaintEvent*);
public slots:
    void ris();
};

Life::Life(QWidget *parent) : QWidget(parent)
{
}

void Life::ris()
{
      //рисуется рисунок
}

int main(int argc, char *argv[])
{    
    QApplication app(argc,argv);
    QWidget window;
    QPushButton go("Go");
    Life a;
    QHBoxLayout lay;                    
    lay.addWidget(&a);                  
    lay.addWidget(&go);
    window.setLayout(&lay);            
    QObject::connect(&go, SIGNAL(clicked()), &a, SLOT(ris()));
    window.show();
    return app.exec();
}

Мне нужно чтоб по нажатию кнопки вызывалась функция ris(), которая в окне рисует рисунок. Но ничего не получается. Что я делаю не так?

Автор: Litkevich Yuriy 2.5.2008, 9:10

у тебя это не в одном файле?

Автор: Don 2.5.2008, 18:57

Цитата(Litkevich Yuriy @ 2.5.2008, 9:10) *
у тебя это не в одном файле?

В одном

Автор: Litkevich Yuriy 2.5.2008, 19:03

тогда надо глянуть вот этот http://www.forum.crossplatform.ru/index.php?showtopic=595&view=findpost&p=3344

Автор: Don 2.5.2008, 20:02

Цитата(Litkevich Yuriy @ 2.5.2008, 19:03) *
тогда надо глянуть вот этот http://www.forum.crossplatform.ru/index.php?showtopic=595&view=findpost&p=3344

Добавил "main.moc" в конец файла. Старые ошибки пропали, но появилась эта:
Error 1 fatal error C1083: Cannot open include file: 'main.moc': No such file or directory

Автор: Litkevich Yuriy 2.5.2008, 20:10

надо qmake сделать,
в крайнем случае раздели проект на несколько файлов.

Автор: Don 2.5.2008, 21:02

Цитата(Litkevich Yuriy @ 2.5.2008, 20:10) *
надо qmake сделать,
в крайнем случае раздели проект на несколько файлов.

Сделал qmake, таже ошибка:
Error 1 fatal error C1083: Cannot open include file: 'main.moc': No such file or directory

Разбил на два файла:
Life.h
CODE

#ifndef LCDRANGE_H
#define LCDRANGE_H

#include <QWidget>
#include <QtGui>


class Life : public QWidget
{
Q_OBJECT
public:
Life(QWidget *parent = 0);
protected:
virtual void paintEvent(QPaintEvent*);
public slots:
void ris(Life );
};
#endif


Life.cpp
CODE

#include <Life.h>

Life::Life(QWidget *parent) : QWidget(parent)
{
}
void Life::ris(Life a)
{
//рисует рисунок
}

int main(int argc, char *argv[])
{
QApplication app(argc,argv);
QWidget window;
QPushButton go("Go");
Life a;
QHBoxLayout lay;
lay.addWidget(&a);
lay.addWidget(&go);
window.setLayout(&lay);
QObject::connect(&go, SIGNAL(clicked()), &a, SLOT(ris(Life )));
window.show();
return app.exec();
}


Все равано те же 4 ошибки, которые и были:
Error 1 error LNK2001: unresolved external symbol "public: virtual struct QMetaObject const * __thiscall Life::metaObject(void)const " (?metaObject@Life@@UBEPBUQMetaObject@@XZ) Life.obj
Error 2 error LNK2001: unresolved external symbol "public: virtual void * __thiscall Life::qt_metacast(char const *)" (?qt_metacast@Life@@UAEPAXPBD@Z) Life.obj
Error 3 error LNK2001: unresolved external symbol "public: virtual int __thiscall Life::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@Life@@UAEHW4Call@QMetaObject@@HPAPAX@Z) Life.obj
Error 4 fatal error LNK1120: 3 unresolved externals d:\MyProgs\C++\Life\debug\life.exe 1

Да и ещё: как вы создаёте классы? Добавляете через Project->Add Class... или создаете файл *.сср, проводите с ним qmake, потом в Visal Stidio 2005 добавляете файл *.h и вписывете в него необходимый код?

Автор: Litkevich Yuriy 2.5.2008, 21:08

я вообще студией не пользуюсь, в том посте который я указывал, там говорилось про студию, прочитай тему полностью, вроде клин солюшен в студии есть, его можно сделать, либо жди когда ViGOur, чего-нибудь посоветует, он в студии работает.

Автор: ViGOur 3.5.2008, 11:21

Don, сделай полный ребилд проекта, думаю должно помочь.

Цитата(' date='2.5.2008, 22:02) *
Да и ещё: как вы создаёте классы? Добавляете через Project->Add Class... или создаете файл *.сср, проводите с ним qmake, потом в Visal Stidio 2005 добавляете файл *.h и вписывете в него необходимый код?
Немного поже опишу полность, как нужно работать в студии без Qt integrator'a c makefile и без них.

В общих словах, вызов qmake перед компиляцией можно установить в самой студии, а не только руками делать, но это нужно, если ты в студии используешь makefile.

Автор: Don 4.5.2008, 17:40

Цитата(ViGOur @ 3.5.2008, 11:21) *
Don, сделай полный ребилд проекта, думаю должно помочь.

Цитата(' date='2.5.2008, 22:02) *
Да и ещё: как вы создаёте классы? Добавляете через Project->Add Class... или создаете файл *.сср, проводите с ним qmake, потом в Visal Stidio 2005 добавляете файл *.h и вписывете в него необходимый код?
Немного поже опишу полность, как нужно работать в студии без Qt integrator'a c makefile и без них.

В общих словах, вызов qmake перед компиляцией можно установить в самой студии, а не только руками делать, но это нужно, если ты в студии используешь makefile.


Да, плиз напиши как установить qmake в студию? И напиши плиз алгоритм как ты создаешь проект, добавляешь классы и создаёшь собственные слоты, чтоб всё работало. И пожалуйста поскорей, а то мне через неделю курсач уже сдать нужно будет :)

Автор: ViGOur 4.5.2008, 17:51

Ок, постараюсь. :)

Автор: ViGOur 5.5.2008, 14:10

Блин, что-то я посмотрел, и мне кажется, что проще написать свой AddInn (Аля Qt Integrator) к студии, чем все эти действия по настройке руками делать самому. :)

Автор: Don 5.5.2008, 19:31

Но кто-то же создавал же в студии собственные слоты и классы. Опишите плиз как-вы это делали

Автор: ViGOur 5.5.2008, 19:50

Мы это делали с помощью Qt Integrator, а он идет только в Qt Comercial Edition, потому никто поделиться им не может, потому как еще и номер лицензии давать прийдется. ;)
Хотя если погуглить, может что и получится найти.

Сейчас подумалось, у тебя загвоздка в том, что ты не можешь создать собственные слоты и классы? Если так то это можно все сделать в Qt Designer'e, после чего компилить как обычно:

qmake -project
qmake
nmake


Я сейчас написал примерно половину описания как настроить студию, чтобы можно было откомпилить Qt проект, пока у меня загвоздка с moc'ом.
Но сразу могу сказать, что хоть создавать классы и слоты ты сможешь в студии, но только руками. А именно писать их сам. :)
Для визуализации этого процесса используется Qt Integrator или Qt Designer.

Автор: Litkevich Yuriy 5.5.2008, 19:53

как я понял он наталкивается на проблему как только макрос Q_OBJECT применяет, а значит он и так все руками делает

Автор: ViGOur 6.5.2008, 11:34

Цитата(Litkevich Yuriy @ 5.5.2008, 20:53) *
как я понял он наталкивается на проблему как только макрос Q_OBJECT применяет, а значит он и так все руками делает
Я пока сам не разобрался как moc работает.

И сегодня по всей видимости не буду особо разбираться, так как только что с экзамена в ГИБДД, http://www.forum.crossplatform.ru/index.php?showtopic=684 :)

Автор: Admin 6.5.2008, 13:04

Обсуждение сдачи на права перенес в: http://www.forum.crossplatform.ru/index.php?showtopic=684

Автор: Don 7.5.2008, 13:53

Цитата(Litkevich Yuriy @ 5.5.2008, 19:53) *
как я понял он наталкивается на проблему как только макрос Q_OBJECT применяет, а значит он и так все руками делает

Да, именно так. Делаю всё руками, но как только подключаю Q_OBJECT вываливаются ошибки, написанные в посте №9

Расскажите плиз, кто пишет в студии с некомерческой Qt как вы добавляте классы разделённые в двух файлах *.h и *.cpp Нужно создавать два тексттовых файла, потом в менять расширения и делать qmake? Или классы добавляются через студию? Как правильно?

Автор: Litkevich Yuriy 7.5.2008, 14:50

а вне студии, а в ее(!) командной строке, можешь какой-нибудь Qt'явый пример скомпилить, который использует сигналы и слоты?

Автор: Don 7.5.2008, 15:02

Цитата(Litkevich Yuriy @ 7.5.2008, 14:50) *
а вне студии, а в ее(!) командной строке, можешь какой-нибудь Qt'явый пример скомпилить, который использует сигналы и слоты?

А как компилить через командную строку? И что такое ее?

Автор: Litkevich Yuriy 7.5.2008, 15:24

просто у студии есть своя командная строка, поищи ее в кнопке пуск там где студия,

Немного о старом:
да и тебе лучше создавать сразу проект для студии вместо мэйкфайлов, где-то в форуме упоминалась проблема работы в студии ищи по ключевому слову VS 2005

вообщем тебе надо почитать
http://www.forum.crossplatform.ru/index.php?showtopic=560&view=findpost&p=3003
Вначале может показаться - вода - но ты всю ветку прочитай, прозапас еще ссылка
http://www.forum.crossplatform.ru/index.php?showtopic=553&hl=VS2005&st=0

Автор: ViGOur 7.5.2008, 15:33

Чтобы с все не обламывалось на макросе Q_OBJECT, нужно файлу *.h, в котором стоит это макрос в свойствах указать:
Ветвь "Configuration Properties / General"
строка "Tool"

Цитата
Custom Build Tool


Для Debug версии
Ветвь "Configuration Properties / Custom Build Step / General"
Строка "Command Line"
Цитата
$(QTDIR)\bin\moc.exe -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -I"$(QTDIR)\include\QtCore" -I"$(QTDIR)\include\QtCore" -I"$(QTDIR)\include\QtGui" -I"$(QTDIR)\include\QtGui" -I"$(QTDIR)\include" -I"$(QTDIR)\include\ActiveQt" -I"debug" -I"." -I$(QTDIR)\mkspecs\win32-msvc2005 -D_MSC_VER=1400 -DWIN32 mainwindow.h -o debug\moc_mainwindow.cpp

Строка "Description"
Цитата
MOC mainwindow.h

Строка "Outputs"
Цитата
debug\moc_mainwindow.cpp

Строка "Additional Dependencies"
Цитата
$(QTDIR)\bin\moc.exe;mainwindow.h


Для Release версии
Строка "Command Line"
Цитата
$(QTDIR)\bin\moc.exe -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -I"$(QTDIR)\include\QtCore" -I"$(QTDIR)\include\QtCore" -I"$(QTDIR)\include\QtGui" -I"$(QTDIR)\include\QtGui" -I"$(QTDIR)\include" -I"$(QTDIR)\include\ActiveQt" -I"release" -I"." -I$(QTDIR)\mkspecs\win32-msvc2005 -D_MSC_VER=1400 -DWIN32 mainwindow.h -o release\moc_mainwindow.cpp

Строка "Description"
Цитата
MOC mainwindow.h

Строка "Outputs"
Цитата
release\moc_mainwindow.cpp

Строка "Additional Dependencies"
Цитата
$(QTDIR)\bin\moc.exe;mainwindow.h


где mainwindow.h имя твоего файла в котором находится макрос Q_OBJECT, следует заменить на твое конечно же. :)

После компиляции будут созданы файлы moc_mainwindow.h в директориях Release и Debug, в зависимости для какой версии компилишь, эти файлы следует добавить в проект, чтобы компилятор не ругался на ошибки линковки.

Вроде бы и все. :)

Автор: Don 7.5.2008, 15:48

А в строке "Outputs" точно debug\moc_mainwindow.cpp ?
Просто после компиляции в папке debug появляется moc_mainwindow.cpp а не moc_mainwindow.h, который нада добавить в проект как ты говорил внизу поста.

Автор: ViGOur 7.5.2008, 16:01

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

Цитата(ViGOur @ 7.5.2008, 16:33) *
После компиляции будут созданы файлы moc_mainwindow.h в директориях Release и Debug
Опечатался не moc_mainwindow.h, а moc_mainwindow.сpp.

Автор: Don 7.5.2008, 16:17

Сделал всё как было описано, ошибки пропали. Но появилась такая
Error 1 error C2248: 'QWidget::QWidget' : cannot access private member declared in class 'QWidget'
Наверное она уже не связана с QOBJECT и слотами, но всё же может подскажите из-за чего она могла появится. Место где она появилась указывается в конце объявления класса в заголовочном файле.

Автор: ViGOur 7.5.2008, 16:31

Покажи строку, на которую так ругается

Автор: Don 7.5.2008, 16:48

Цитата(ViGOur @ 7.5.2008, 16:31) *
Покажи строку, на которую так ругается

};
:)

Ну вот вобщем весь заголовочный файл:
CODE

#ifndef LCDRANGE_H
#define LCDRANGE_H

#include <QWidget>
#include <QtGui>


class Life : public QWidget
{
Q_OBJECT
public:
Life(QWidget *parent = 0);
void smile(int x, int y);
protected:
virtual void paintEvent(QPaintEvent*);
public slots:
void ris(Life );
private:
int imatrix[10][10];
int newmatrix[10][10];
}; <======================== в этой строке показывет ошибку
#endif

весь private убирал, ошибка таже в том же месте

Автор: ViGOur 7.5.2008, 16:54

Да нет, я думаю, что ты где-то обращаешься на прямую к imatrix или к newmatrix из вне данного класса. :)

Автор: Don 7.5.2008, 17:47

Цитата(ViGOur @ 7.5.2008, 16:54) *
Да нет, я думаю, что ты где-то обращаешься на прямую к imatrix или к newmatrix из вне данного класса. :)


а может быть обращение напрямую к данным класса в moc_mainwindow.cpp ? А то я в своём *.cpp не нахожу прямого обращения к данным класса.

Автор: Litkevich Yuriy 7.5.2008, 17:53

а ты оригинальный пример (%QTDIR%\examples\tutorial\t7\) скомпилить можешь?

Автор: Don 7.5.2008, 18:14

Цитата(Litkevich Yuriy @ 7.5.2008, 17:53) *
а ты оригинальный пример (%QTDIR%\examples\tutorial\t7\) скомпилить можешь?

Да, компилируется. Но в там в примере два moc_*.cpp файла. У одного обычная иконка срр-файла, а у второго со значком "Кирпич в красном круге", ну или как из ПДД "Въезд запрещён" По содержанию они вроде никак не отличаются. У меня генерирутся только один moc_*.cpp с обычной иконкой.

Да, и ешё. В примере файл moc_*.cpp находится в папке "Generated Files". В своём проекте я сам создавал такую папку добавлял туда файл.

А можно главную функцию main писать в файл *.cpp, где происходит реализация класса? Я в своём проекте так и сделал в отличии от примера. В примере функция main и реализация класса находится в разных *.срр файлах.

Автор: Litkevich Yuriy 7.5.2008, 18:29

Насчет файла с "кирпичем", включи в проводнике отображение расширения файлов, это должен быть объектник (*.o)

Давай сначало со штатным примером поэксперементируем:
Скопируй папку примера, куда-нибуть,
прибей в каталоге все кроме файлов *.cpp, *.h, t7.pro
а в файле проекта t7.pro прибей все кроме:

TEMPLATE    = app
CONFIG        += qt warn_on
HEADERS        = lcdrange.h
SOURCES        = lcdrange.cpp \
          main.cpp
TARGET        = t7

Теперь твая задача, добится чтобы это компилилось студией.
Как ты создаешь файл проекта для студии?
qmake -t vcapp t7.pro

так?

Автор: Don 7.5.2008, 18:40

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

Объктники это файлы с расширением *.obj? Других не нашёл.
И у меня как раз не создаётся файл moc_*.obj

Автор: Litkevich Yuriy 7.5.2008, 18:45

пока проделай то что я сказал, ну и опиши как ты создаешь проект для студии.

Автор: Don 7.5.2008, 18:53

Цитата(Litkevich Yuriy @ 7.5.2008, 18:45) *
пока проделай то что я сказал, ну и опиши как ты создаешь проект для студии.


Сделал как ты сказал в посте №34. Потом в командной строке выполнил
qmake t7.pro
qmake -tp vc t7.pro создал проект
потом запустил проект, скомпилировал всё заработало.

У меня там не создаётся moc_*.obj

Автор: Litkevich Yuriy 7.5.2008, 18:55

Цитата(Don @ 7.5.2008, 22:53) *
потом запустил проект, скомпилировал всё заработало.

т.е. теперь ты можешь запустить экзешник?
Цитата(Don @ 7.5.2008, 22:53) *
У меня там не создаётся moc_*.obj

тогда может он и не нужен?

Автор: Don 7.5.2008, 19:03

Цитата(Litkevich Yuriy @ 7.5.2008, 18:55) *
т.е. теперь ты можешь запустить экзешник?

Да могу, всё работает.

Цитата(Litkevich Yuriy @ 7.5.2008, 18:55) *
тогда может он и не нужен?

Незнаю, но в примере он же создаётся

Автор: Litkevich Yuriy 7.5.2008, 19:09

Цитата(Don @ 7.5.2008, 22:53) *
У меня там не создаётся moc_*.obj

Цитата(Don @ 7.5.2008, 23:03) *
Незнаю, но в примере он же создаётся

непонял, это ты уже про свое творение?
Давай с этим примером покончим.

Автор: Don 7.5.2008, 19:21

Цитата(Litkevich Yuriy @ 7.5.2008, 19:09) *
непонял, это ты уже про свое творение?
Давай с этим примером покончим.


Насчёт *.obj да, это я про своё творение. Но сделал у весь qmake и файл с кирпичём появился. Но а с t7 он меня работает, делая как ты мне говорил.

Мы по ходу начали друг друга не понимать. Я спрашивал: "Может быть, что в moc_*.cpp файлах происходить обращение данным класса напрямую". Просто счас у меня вылазит постоянно одна и таже ошибка
Error 1 error C2248: 'QWidget::QWidget' : cannot access private member declared in class 'QWidget'

Я сней не могу разабраться.

Хотя не moc_*.obj файл в мёом творении всё равно не создаётся.

Автор: Litkevich Yuriy 7.5.2008, 19:44

если ты moc-файлы руками не правишь, то и ошибку в них не ищи, ищи у себя, если проект не большой выкладывай все вместе с pro-файлом, бум изучать.

посмотри, что у тебя идет следующей строкой после

#include "lcdrange.h"

кроме препроцессорных директив, в тех файлах где есть такой инклуд, иногда компилер показывает предыдущую строку вызвавшую ошибку, а она может быть имено в конце хидера.

Автор: Don 8.5.2008, 15:53

Ладно, со своей предыдущей ошибкой я разобрался, при использовании QOBJECT ошибок не выдаёт, все файлы moc_*.cpp и moc_*.obj генерируются, но кнопка всё равно остаётся мёртвой, жмёшь на неё, а она ничего не делает. Люди добрые посмотрите пожайлуйста мой код и скажите что я делаю не так.

Эта версия моей проги при запуске в клетках рандомно рисуются смайлики, а при нажатии на кнопку должна ещё раз рандомно перерисовывать смайлики, но этого не происходит.

life.h

CODE

#ifndef LCDRANGE_H
#define LCDRANGE_H

#include <QtGui>
#include <QWidget>
#include <QPainter>



class Life : public QWidget
{
Q_OBJECT
public:
Life(QWidget *parent = 0);
void smile(int x, int y );
protected:
virtual void paintEvent(QPaintEvent*);
public slots:
void ris();
private:
int imatrix[10][10];
int newmatrix[10][10];
};
#endif


life.cpp
CODE

#include <QApplication>
#include <QPainter>
#include <QTextCodec>
#include <QPushButton>
#include <QtGui>
#include <math.h>
#include <time.h>
#include <QPushButton>
#include <Life.h>

Life::Life(QWidget *parent) : QWidget(parent)
{
srand(time(0));
for (int i = 0; i<10; i++)
for(int j=0; j<10; j++) imatrix[i][j] = rand()%3;
}
void Life::ris()
{

int x = 20;
int y = 40;
srand(time(0));
for (int i = 0; i<10; i++)
for(int j=0; j<10; j++) newmatrix[i][j] = rand()%3;
for (int i = 0; i<10; i++)
{
for(int j=0; j<10; j++)
{
if (newmatrix[i][j] == 1) smile(x,y);
x = x + 50;
}
y = y + 50;
x = 20;
}


}
void Life::paintEvent(QPaintEvent*)
{

QPainter paint(this);
int x = 15;
int y;
paint.setRenderHint(QPainter::Antialiasing,true);
paint.setPen(QPen(Qt::black, 1, Qt::SolidLine, Qt::RoundCap));
paint.setBrush(QBrush(Qt::white, Qt::SolidPattern));
for (int i=1; i<=11; i++) //рисуем клетку
{
paint.drawLine(x,15,x,515);

x = x + 50;
}
x = 15;
y = 19;
for (i=1; i<=11; i++)
{
paint.drawLine(15,x,515,x);
x = x+50;
}
x = 19;
paint.setPen(QPen(Qt::white)); //рисуем прямоугольники в клетках
paint.drawRoundRect(19,19,42,42);
for (i=1; i<=10; i++)
{
for (int j=1; j<=10; j++)
{
paint.drawRoundRect(x,y,42,42);
x = x+50;
}
x = 19;
y = y +50;
}
srand(time(0));
x = 20;
y = 40;

for (int i = 0; i<10; i++) //рисуем смайлики
{
for(int j=0; j<10; j++)
{
if (imatrix[i][j] == 1) smile(x,y);
x = x + 50;
}
y = y + 50;
x = 20;
}
paint.end();
}

void Life::smile(int x, int y) //рисуем смайлик
{
QPainter paintsmile(this);
paintsmile.setRenderHint(QPainter::Antialiasing,true);
paintsmile.setPen(QPen(Qt::black));
paintsmile.setBrush(QBrush(Qt::yellow));
paintsmile.drawEllipse(x,y-20,40,40);
paintsmile.drawEllipse(x+11,y-5,3,3);
paintsmile.drawEllipse(x+26,y-5,3,3);
QRect rect(x+6,y-24,28,39);
int a = 30 * 112;
int b = 120 * 16;
paintsmile.drawArc(rect,a,B);
paintsmile.end();

}


main.cpp
CODE

#include <QApplication>
#include <QPainter>
#include <QHBoxLayout>
#include <QSpinBox>
#include <QTextCodec>
#include <QPushButton>
#include <QtGui>
#include <math.h>
#include <time.h>
#include <QPushButton>
#include <Life.h>

int main(int argc, char *argv[])
{
QApplication app(argc,argv);
QWidget window;
QPushButton go("Go");
//go.setGeometry(550,490,70,28);
go.setFixedSize(70,28);
Life a;
QObject::connect(&go, SIGNAL(clicked()), &a, SLOT(ris()));
window.setGeometry(100,100,700,550); //рамки окна
window.setFixedSize(700,550); //фиксируем границы
QHBoxLayout lay; //собираем
lay.addWidget(&a); //все виджеты
lay.addWidget(&go);
window.setLayout(&lay); //вместе

window.show();
return app.exec();
}

Автор: Litkevich Yuriy 8.5.2008, 16:37

Цитата(Don @ 8.5.2008, 19:53) *
Ладно, со своей предыдущей ошибкой я разобрался, при использовании QOBJECT ошибок не выдаёт, все файлы moc_*.cpp и moc_*.obj генерируются

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

почему пишишь свой заголовочник как системный?
(#include <Life.h>)

уменя перерисовывается, я не стал вникать в то, как работает программа, тупо повторил то, что в конструкторе, разница в строке:
в конструкторе:
...
imatrix[i][j] = rand()%3;
...

а в слоте было:
...
newmatrix[i][j] = rand()%3;
...

Автор: Don 8.5.2008, 16:58

Ошибка была в том, что я при реализации функций класса, обращался к данным этого же класса как бы через объект: а.ris() к примеру, а надо было просто ris().

Перепиши то, что ты написал в тегах кода и то что исправил. А то у меня ничего не видно (см прикреплённый скрин)

 

Автор: Litkevich Yuriy 8.5.2008, 17:24

Цитата(Don @ 8.5.2008, 20:58) *
А то у меня ничего не видно (см прикреплённый скрин
поправил, должно быть видно (про баг с отображением админам написал)

Автор: Don 8.5.2008, 17:42

Чёт я не понял, что ты исправил. У меня как не работало, так и не работает

В конструкторе в imatrix рандомно задаются значения для рисования смайликов при запуске проги.
А функция ris() должна рандомно задать newmatrix и по этой же матрице опять перерисовывать смайлики. И ris() дожна вызыватся по нажатии на кнопку, но у меня она не работает

Автор: Litkevich Yuriy 8.5.2008, 17:59

я сделал как в конструкторе, но есть какой-то касяк с событием paintEvent, а именнно:
я переделал функцию main так, чтобы там были указатели, а не объекты, при этом перерисовываться перестало, но при включеном стиле Cleanlooks, все перерисовывается, попробуй после нажатия на кнопку переключаться в любое другое окно, а потом назад.
Этот трюк помогает.
и еще используй qDebug, чтобы видеть что происходит, после добавления
отладки в обработчик события

void Life::paintEvent(QPaintEvent*)
{
qDebug() << "paintEvent";
...

вижу такое:
paintEvent
QPainter::end: Painter not active, aborted
paintEvent
QPainter::end: Painter not active, aborted
paintEvent
QPainter::end: Painter not active, aborted
paintEvent
QPainter::end: Painter not active, aborted
paintEvent
QPainter::end: Painter not active, aborted



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

Лекарство:
в конце своего слота (ris())
добавь repaint(); - принудительно перерисовать.

Автор: Don 8.5.2008, 18:04

А как включить стиль Cleanlooks?

Автор: Litkevich Yuriy 8.5.2008, 18:07

Прочитай конец моего предыдущего поста (о лекарстве)
main.cpp:

#include <QApplication>
#include <QPainter>
#include <QHBoxLayout>
#include <QSpinBox>
#include <QTextCodec>
#include <QPushButton>
#include <QtGui>
#include <math.h>
#include <time.h>
#include <QPushButton>
#include <Life.h>

int main(int argc, char *argv[])
{    
    QApplication app(argc,argv);
    
    // Установим кодировку для функции перевода tr()
    QTextCodec::setCodecForTr(QTextCodec::codecForName("Windows-1251"));
    
    // Сделаем симпотичный вид
    QStyle *pStyle = QStyleFactory::create("Plastique");//Cleanlooks Plastique windows
    QApplication::setStyle(pStyle); //
    app.setPalette(pStyle->standardPalette());
    
    QWidget        window;
    QPushButton *btngo = new QPushButton(QObject::tr("Вперед"));
    Life        *board = new Life;
    QHBoxLayout *lay = new QHBoxLayout;
    
    btngo->setFixedSize(70,28);
    
    QObject::connect(btngo, SIGNAL(clicked()), board, SLOT(ris()));
    
    window.setGeometry(100,100,700,550); //рамки окна
    window.setFixedSize(700,550);        //фиксируем границы
    
    //собираем все виджеты вместе
    lay->addWidget(board);                   //
    lay->addWidget(btngo);
    
    window.setLayout(lay);              //
    window.show();
    return app.exec();
}

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)