Версия для печати темы
Форум на 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,
;
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)