crossplatform.ru

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

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Передача значений из метода paintEvent в другой класс в тот же самый метод
zuze
  опции профиля:
сообщение 16.11.2012, 11:22
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 211
Регистрация: 4.11.2012
Пользователь №: 3589

Спасибо сказали: 0 раз(а)




Репутация:   0  


1. Есть класс

#ifndef L_H
#define L_H

#include <QLabel>
#include <QPainter>
#include <QTimer>
#include <math.h>

class l : public QLabel
{
    Q_OBJECT
public:
    explicit l(QWidget *parent = 0);
    float alpha; // Угол поворота

signals:

public slots:

protected:
    void paintEvent(QPaintEvent *);

};

#endif // L_H


#include "l.h"

l::l(QWidget *parent) :
    QLabel(parent)
{
    alpha = -1.0;
}
// Ввывод окружности и линию
void l::paintEvent(QPaintEvent *)
{
        alpha += 2*M_PI/1000;
}


2. Как alpha передать в другой класс и в такой же метод?

например в такой

#ifndef P_H
#define P_H

#include <QLabel>
#include <QPainter>

class p : public QLabel
{
    Q_OBJECT
public:
    explicit p(QWidget *parent = 0);
    float d;

signals:

public slots:

private:
    void paintEvent(QPaintEvent *);

};

#endif // P_H


#include "p.h"

p::p(QWidget *parent) :
    QLabel(parent)
{
}
void p::paintEvent(QPaintEvent *)
{
    d = alpha;
}


В классе 'p' не видна же alpha. Как же правильно передать alpha? Через Сигналы и Слоты вроде надо, но я не пойму как это сделать. Помогите пожалуйста разобраться.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 16.11.2012, 13:23
Сообщение #2


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Через сигналы:

В class l в signals добавляем
signals:
void alphaChanged(int);

void l::paintEvent(QPaintEvent *)
{
        alpha += 2*M_PI/1000;
        emit alphaChanged(alpha);
}
Затем:
class p : public QLabel
{
...
public slots:
        void setAlpha(int value)

В MainWindow, где вы имеете доступ к обоим классам:
connect(lbl1, SIGNAL(alphaChanged(int), lbl2, SLOT(setAlpha(int)));
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
zuze
  опции профиля:
сообщение 21.11.2012, 22:28
Сообщение #3


Участник
**

Группа: Участник
Сообщений: 211
Регистрация: 4.11.2012
Пользователь №: 3589

Спасибо сказали: 0 раз(а)




Репутация:   0  


RazrFalcon, я сделал, как Вы написали и объявил ещё lbl1, lbl2.

В MainWindow.h

public:
    locator *lbl1;
    pryamaya *lbl2;


В MainWindow.cpp (в конструкторе)

lbl1 = new l();
lbl2 = new p();


А в результате компилятор всё равно выдаёт ошибку:
In mamber function 'virtual void p::paintEvent(QPaintEvent *)':
'alpha' was not declared in this scope.

То есть всё равно переменная alpha не видна. Что же не так?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 21.11.2012, 22:35
Сообщение #4


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Конечно не видет.
Вы должны в QLabel создать переменную alpha и задает ее значение через слот setAlpha(int)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
zuze
  опции профиля:
сообщение 21.11.2012, 23:08
Сообщение #5


Участник
**

Группа: Участник
Сообщений: 211
Регистрация: 4.11.2012
Пользователь №: 3589

Спасибо сказали: 0 раз(а)




Репутация:   0  


RazrFalcon, то есть мне надо в класс p.h добавить

public:
    int alpha;


А как вот значение переменной alpha задать через слот setAlpha(int)?

Прошу прощения, что я такие "тупые" вопросы спрашиваю, по мере понимания всех процессов в Qt их будет всё меньше.

Сообщение отредактировал zuze - 21.11.2012, 23:10
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 22.11.2012, 3:15
Сообщение #6


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Пример во вложении.

Сообщение отредактировал RazrFalcon - 22.11.2012, 3:17
Прикрепленные файлы
Прикрепленный файл  signals.zip ( 2.77 килобайт ) Кол-во скачиваний: 68
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
zuze
  опции профиля:
сообщение 22.11.2012, 20:23
Сообщение #7


Участник
**

Группа: Участник
Сообщений: 211
Регистрация: 4.11.2012
Пользователь №: 3589

Спасибо сказали: 0 раз(а)




Репутация:   0  


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

Файлы h

#ifndef L_H
#define L_H

#include <QLabel>

class l : public QLabel
{
    Q_OBJECT
public:
    explicit l(QWidget *parent = 0);
    float alpha;

signals:
    void alphaChanged(float);

public slots:
    void paintEvent(QPaintEvent *);

};

#endif // L_H


#ifndef P_H
#define P_H

#include <QLabel>

class p : public QLabel
{
    Q_OBJECT
public:
    explicit p(QWidget *parent = 0);
    float alpha, d;

signals:

public slots:
    void paintEvent(QPaintEvent *);
    void setAlpha(float value);
};

#endif // P_H


#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "l.h"
#include "p.h"

namespace Ui {
    class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    l *lbl1;
    p *lbl2;

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H


Файлы cpp

#include "l.h"
#include "math.h"

l::l(QWidget *parent) :
    QLabel(parent)
{
}
void l::paintEvent(QPaintEvent *)
{
        alpha = 2*M_PI/1000;
        emit alphaChanged(alpha);
}


#include "p.h"

p::p(QWidget *parent) :
    QLabel(parent)
{
}
void p::paintEvent(QPaintEvent *)
{
    setAlpha(alpha);
    d = alpha;
}
void p::setAlpha(float value)
{
    alpha = value;
}


#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    lbl1 = new l();
    lbl2 = new p();
    connect(lbl1, SIGNAL(alphaChanged(float)), lbl2, SLOT(setAlpha(float)));

}

MainWindow::~MainWindow()
{
    delete ui;
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 22.11.2012, 21:55
Сообщение #8


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Цитата
void p::setAlpha(float value)
{
alpha = value;
update();
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
zuze
  опции профиля:
сообщение 22.11.2012, 22:19
Сообщение #9


Участник
**

Группа: Участник
Сообщений: 211
Регистрация: 4.11.2012
Пользователь №: 3589

Спасибо сказали: 0 раз(а)




Репутация:   0  


RazrFalcon, я не могу поставить в эту процедуру update(); , так как у меня линии вращаются по таймеру. И update(); я вызываю там, где запускаю таймер. Может как-то иначе можно? Запуск таймеров у меня производится в файле mainwindow.cpp.
Моя задача состоит в том что я нажимаю на кнопочку, вертится одна линия (в полярных координатах), как нажимаю другую кнопку то рисуется другая линия, которая передвигается (по прямоугольным координатам). И что бы при переключении линия вертелась с последнего момента перед переключением, а не с нуля. Вот для этих целей я хочу что бы переменная из одного класса была видна в другом классе.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 23.11.2012, 0:46
Сообщение #10


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Так если нужно просто сохранить последние значение - зачем его вообще выносить из класса?
Не проще ли сделать что бы при первом старте alpha=-1, а при последующих alpha проверялась на равенство -1, и если не -1 - то рисуем с текущей alpha.
Какие проблемы.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.4.2024, 5:43