crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в А какие вобще сигналы ловятся слотами?
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
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();
}
Don Дата 8.5.2008, 18:04
  А как включить стиль Cleanlooks?
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, 17:42
  Чёт я не понял, что ты исправил. У меня как не работало, так и не работает

В конструкторе в imatrix рандомно задаются значения для рисования смайликов при запуске проги.
А функция ris() должна рандомно задать newmatrix и по этой же матрице опять перерисовывать смайлики. И ris() дожна вызыватся по нажатии на кнопку, но у меня она не работает
Litkevich Yuriy Дата 8.5.2008, 17:24
 
Цитата(Don @ 8.5.2008, 20:58) *
А то у меня ничего не видно (см прикреплённый скрин
поправил, должно быть видно (про баг с отображением админам написал)
Don Дата 8.5.2008, 16:58
  Ошибка была в том, что я при реализации функций класса, обращался к данным этого же класса как бы через объект: а.ris() к примеру, а надо было просто ris().

Перепиши то, что ты написал в тегах кода и то что исправил. А то у меня ничего не видно (см прикреплённый скрин)
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, 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 Дата 7.5.2008, 19:44
  если ты moc-файлы руками не правишь, то и ошибку в них не ищи, ищи у себя, если проект не большой выкладывай все вместе с pro-файлом, бум изучать.

посмотри, что у тебя идет следующей строкой после
#include "lcdrange.h"

кроме препроцессорных директив, в тех файлах где есть такой инклуд, иногда компилер показывает предыдущую строку вызвавшую ошибку, а она может быть имено в конце хидера.
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 файл в мёом творении всё равно не создаётся.
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 28.3.2024, 18:33