crossplatform.ru

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


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

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
Теги
Выровнять по центру
Ссылка на тему
Ссылка на сообщение
Скрытый текст
Сокращение
Код с подсветкой
Offtopic
 
Удалить форматирование
Спец. элементы
Шрифт
Размер
 
Цвет шрифта
 
Отменить ввод
Вернуть ввод
Полужирный
Курсив
Подчеркнутый
 
 
Смайлики
Вставить изображение
Вставить адрес электронной почты
Цитата
Код
Раскрывающийся текст
 
Увеличить отступ
По левому краю
По центру
По правому краю
Вставить список
Вставить список

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


Последние 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 Рейтинг@Mail.ru Текстовая версия Сейчас: 11.7.2025, 6:44