crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> прорисовка с paintEvent
voipp
  опции профиля:
сообщение 24.10.2009, 16:39
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 116
Регистрация: 20.10.2009
Из: Msk
Пользователь №: 1166

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




Репутация:   0  


как реализовать индивидуальные для сигналов прорисовки виджета?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 24.10.2009, 16:47
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

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




Репутация:   44  


Цитата(voipp @ 24.10.2009, 17:39) *
как реализовать индивидуальные для сигналов прорисовки виджета?


Эээ... если я правильно понял о чем речь. :)
class MyWidget : public QWidget
{
    Q_OBJECT
public:
    enum State { State1, State2 };

public slots:
    void    setState( int st )
    {
        m_state = st;
        update();
    }

protected:
    virtual void paintEvent( QPaintEvent * )
    {
        QPainter p( this );
        switch( m_state )
        {
        case State1:
            // Рисуем состояние 1
        case State2:
            // Рисуем состояние 2
        }
    }

private:
    int    m_state;
};
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
voipp
  опции профиля:
сообщение 24.10.2009, 17:08
Сообщение #3


Участник
**

Группа: Участник
Сообщений: 116
Регистрация: 20.10.2009
Из: Msk
Пользователь №: 1166

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




Репутация:   0  


Цитата(BRE @ 24.10.2009, 17:47) *
Цитата(voipp @ 24.10.2009, 17:39) *
как реализовать индивидуальные для сигналов прорисовки виджета?


Эээ... если я правильно понял о чем речь. :)
class MyWidget : public QWidget
{
    Q_OBJECT
public:
    enum State { State1, State2 };

public slots:
    void    setState( int st )
    {
        m_state = st;
        update();
    }

protected:
    virtual void paintEvent( QPaintEvent * )
    {
        QPainter p( this );
        switch( m_state )
        {
        case State1:
            // Рисуем состояние 1
        case State2:
            // Рисуем состояние 2
        }
    }

private:
    int    m_state;
};



спасибо

но я вообще хотел совсем в другом классе реализовать сигналы. Проблема заключается что в этих сигналах я вызываю update() а он уже перерисовывает widget который определен в другом классе тоесть никакой информации о том что за кнопка вызввала перерисовку нет в этом то и проблема
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 24.10.2009, 17:11
Сообщение #4


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

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




Репутация:   44  


Цитата(voipp @ 24.10.2009, 18:08) *
но я вообще хотел совсем в другом классе реализовать сигналы. Проблема заключается что в этих сигналах я вызываю update() а он уже перерисовывает widget который определен в другом классе тоесть никакой информации о том что за кнопка вызввала перерисовку нет в этом то и проблема

Покажи примерный код, а то по описанию не очень понятно. ;)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 24.10.2009, 17:59
Сообщение #5


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9648
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Цитата(voipp @ 24.10.2009, 21:08) *
но я вообще хотел совсем в другом классе реализовать сигналы.
реализуй сигналы там, где они нужны.
Цитата(voipp @ 24.10.2009, 21:08) *
Проблема заключается что в этих сигналах я вызываю update()
в сигналах ты ничего не делаешь, они просто посылаются. (Т.е. с точки зрения Си++ ты не описываешь код функции-сигнала). Функцию update() ты вызываешь в слоте, как в примере, который привёл тебе BRE

voipp, не цитируй сообщения целиком, цитируй только нужный фрагмент (см. справку)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
voipp
  опции профиля:
сообщение 24.10.2009, 18:53
Сообщение #6


Участник
**

Группа: Участник
Сообщений: 116
Регистрация: 20.10.2009
Из: Msk
Пользователь №: 1166

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




Репутация:   0  


Я создал приложение вкотором на доке 4 кнопки а в центре виджет widget для рисования
Вот что у меня получилось но выскакивает ошибка что множственное определение (multiple definition) и показывается код который преобразовал компилятор COM
вот mainwindow.cpp -

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent), ui(new Ui::MainWindow)
{

    ui->setupUi(this);
curr_direct= down;
connect(ui->Up,SIGNAL(Clicked),this,SIGNAL(pUp()));
connect(ui->Down,SIGNAL(Clicked),this,SIGNAL(pDown()));
connect(ui->Left,SIGNAL(Clicked),this,SIGNAL(pLeft()));
connect(ui->Right,SIGNAL(Clicked),this,SIGNAL(pRight()));

}


void MainWindow::pUp(){
    curr_direct= up;
    update();
};

также реализуются кнопки вниз налево направо.

void MainWindow::paintEvent(QPaintEvent*){
    switch (curr_direct){
        case up:
            where2paint->Up();
            break;
        case down:
            where2paint->Down();
            break;
        case left:
            where2paint->Left();
            break;
        case right:
            where2paint->Right();
            break;
        };
};
//.......

widget.cpp -

Widget::Widget(QWidget *parent):QWidget(parent)
{
    painter= new QPainter(this);
    pen= new QPen;
    pen->setColor(Qt::red);
    pen->setWidth(5);
    painter->setPen(*pen);
    *curr_point= QPoint(0,0);

}

void Widget::Up(){
    painter->drawLine(*curr_point,(*curr_point+= QPoint(curr_point->x(),curr_point->y()- 5)));
};
также реализуются кнопки вниз налево и направо.
/......


curr_direct это перечисление со значениями ltft right up down
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 24.10.2009, 22:01
Сообщение #7


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9648
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Первое, что бросается в глаза - это:
Цитата(voipp @ 24.10.2009, 22:53) *
connect(ui->Right,SIGNAL(Clicked),this,SIGNAL(pRight()));
сигнал - это функция, и форма записи у неё такая:
function()
т.е. со скобками

Цитата(voipp @ 24.10.2009, 22:53) *
painter= new QPainter(this);
относительно рисовальщика уже упоминалось, что его лучше создавать в виде локальной переменной в функции paintEvent
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
voipp
  опции профиля:
сообщение 25.10.2009, 6:33
Сообщение #8


Участник
**

Группа: Участник
Сообщений: 116
Регистрация: 20.10.2009
Из: Msk
Пользователь №: 1166

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




Репутация:   0  


спасибо за советы. После исправлений все заработало но возникла другая проблема(про которую я забыл) - рисунок после перерисовки стирался и приходилось заново все рисовать - может есть смысл рисовать используя QCanvas может он более для этого удобен?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 25.10.2009, 9:41
Сообщение #9


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

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




Репутация:   44  


Цитата(voipp @ 25.10.2009, 6:33) *
спасибо за советы. После исправлений все заработало но возникла другая проблема(про которую я забыл) - рисунок после перерисовки стирался и приходилось заново все рисовать - может есть смысл рисовать используя QCanvas может он более для этого удобен?

Можно рисовать на QPixmap и эту картинку выводить на виджет в paintEvent.
Можно сохранять все состояния линий в списке и в paintEvent их все перерисовывать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 25.10.2009, 11:59
Сообщение #10


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9648
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Цитата(voipp @ 25.10.2009, 10:33) *
может есть смысл рисовать используя QCanvas
нет такого класса в Qt4!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 13.11.2018, 6:17