crossplatform.ru

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

> Нарисовать фигуру в label по нажатию кнопки
zuze
  опции профиля:
сообщение 8.11.2012, 19:09
Сообщение #1


Участник
**

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

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




Репутация:   0  


Мне надо нарисовать фигуру в label по нажатию кнопки. В данном примере пытаюсь нарисовать эллипс.

Я делал так:

ldialog.h

#ifndef LDIALOG_H
#define LDIALOG_H

#include <QDialog>
#include <QPainter>

namespace Ui {
    class ldialog;
}

class ldialog : public QDialog
{
    Q_OBJECT

public:
    explicit ldialog(QWidget *parent = 0);
    ~ldialog();

public slots:
    void onClick();
    void MyDrawEllipse();

private:
    Ui::ldialog *ui;

};

#endif // LDIALOG_H


ldialog.cpp

#include "ldialog.h"
#include "ui_ldialog.h"

ldialog::ldialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::ldialog)
{
    ui->setupUi(this);
    connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(onClick()));

}

ldialog::~ldialog()
{
    delete ui;
}
void ldialog::MyDrawEllipse()
{
        QPainter Ellipse1(ui->label);
        Ellipse1.setBrush(QBrush(Qt::black));
        Ellipse1.drawEllipse(10, 10, 600, 600);
}
void ldialog::onClick()
{
   ui->label->update();
}


main.cpp

#include <QtGui/QApplication>
#include "ldialog.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    ldialog w;
    w.show();

    return a.exec();
}


Но после нажатию на кнопку эллипс не рисуется. Что я сделал не так?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
2 страниц V  < 1 2  
Начать новую тему
Ответов (10 - 16)
zuze
  опции профиля:
сообщение 10.11.2012, 15:04
Сообщение #11


Участник
**

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

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




Репутация:   0  


Litkevich Yuriy, большое спасибо. Я сделал В Дизайнере щёлкнуть по твой метке (QLabel), правой кнопкой мыши ->"Преобразовать в ..." (Promote to) и указал там класс l. После этого эллипс стал выводиться на label и даже не надо прописывать

ui->label->update();


Теперь вся загвоздка в том чтобы рисовался эллипс по нажатию кнопки.
Я пробовал так:

В файле ldialog.cpp

void ldialog::onClick()
{
    ui->label->update();
}


А в конструкторе прописал

connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(onClick()));


А в файл ldialog.h добавил:

public slots:
    void onClick();


Это может и сработало бы, если бы автоматически эллипс не рисовался. Но в данном случае это не подходит, так как эллипс рисуется без всякого запуск update().

1. Что же делать?
2. И если можно расскажите пожалуйста назначение действия "В Дизайнере щёлкнуть по твой метке (QLabel), правой кнопкой мыши ->"Преобразовать в ..." (Promote to) и указал там класс l"?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 11.11.2012, 5:07
Сообщение #12


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

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

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




Репутация:   94  


Цитата(zuze @ 10.11.2012, 17:04) *
Я пробовал так:

Цитата(zuze @ 10.11.2012, 17:04) *
так как эллипс рисуется без всякого запуск update().
что ты ожидаешь от метода update()?


Цитата(zuze @ 10.11.2012, 17:04) *
2. И если можно расскажите пожалуйста назначение действия "В Дизайнере щёлкнуть по твой метке (QLabel), правой кнопкой мыши ->"Преобразовать в ..." (Promote to) и указал там класс l"?
Просто дизайнер будет создавать ui-файл, в котором вместо виджета типа Х упоминается его наследник. А во время дизайна (для наглядности) используется базовый класс.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
zuze
  опции профиля:
сообщение 11.11.2012, 8:17
Сообщение #13


Участник
**

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

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




Репутация:   0  


Цитата(Litkevich Yuriy @ 11.11.2012, 5:07) *
что ты ожидаешь от метода update()?


Как я понял update() помечает элемент, как требующий перерисовки. А я думал, что он будет отключать автоматическое рисование на элементе и позволит нарисовать, только при нажатии кнопки.

Что тогда надо сделать, что бы заработало у меня?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
zuze
  опции профиля:
сообщение 11.11.2012, 10:41
Сообщение #14


Участник
**

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

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




Репутация:   0  


Как я понял, чтобы рисовалось по нажатию кнопки надо сделать так было:

1. в файле l.h добавить

public:
    bool FlagDraw;


2. В файле l.cpp добавить в конструктор

FlagDraw = false;


3. В файле l.cpp изменить метод paintEvent(QPaintEvent *)

void locator::paintEvent(QPaintEvent *)
{
    if (FlagDraw == false)
    {
        QPainter Ellipse(this);
        Ellipse.setBrush(QBrush(Qt::black));
        Ellipse.drawEllipse(0, 0, 600, 600);
    }
}


4. В файле ldialog.cpp изменить метод onClick()

void locatordialog::onClick()
{
    FlagDraw = true;
    if (FlagDraw == true)
     ui->label->update();
}


Но так как в этом классе переменная FlagDraw не видна пытался добавить в файл ldialog.h

public:
    friend class l;


Но это не помогло, что можно придумать, что бы FlagDraw была видна в классе ldialog или вообще как-то иначе надо было делать?

Прошу прощения в посте в место класса ldialog я случайно написал locatordialog, а в место класса l я случайно написал locator. Сам поправить свой пост не мог, так как почем-то нет таких прав, даже профиль не могу свой изменить, хотя авторизацию на форуме прошёл. Писал в администрацию форума, но она мне не ответила.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 11.11.2012, 14:12
Сообщение #15


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

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

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




Репутация:   94  


Цитата(zuze @ 11.11.2012, 10:17) *
Как я понял update() помечает элемент, как требующий перерисовки.
только пометка о необходимости принудительно перерисовать виджет (вызвать его метод repaint()). Обычно перерисовка происходит при изменении размеров виджета. А вот когда происходит изменение его содержимого, программист должен сам вызвать этот метод.


Цитата(zuze @ 11.11.2012, 12:41) *
Что тогда надо сделать, что бы заработало у меня?
Цитата(Litkevich Yuriy @ 10.11.2012, 16:07) *
вообще правильный путь для решения данной задачи:
Использовать один из классов (QImage, QPixmap) на нём рисуем с помощью рисовальщика (QPainter), тогда, когда нам это удобнее. Затем полученный рисунок устанавливаем в качестве изображения метки (QLabel::setPixmap()).
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
zuze
  опции профиля:
сообщение 11.11.2012, 14:19
Сообщение #16


Участник
**

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

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




Репутация:   0  


Litkevich Yuriy, я так понял, что бы FlagDraw была видна в классе ldialog, то нужно передать с помощью Сигнала её. Не могли бы Вы рассказать как правильно это сделать?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
zuze
  опции профиля:
сообщение 11.11.2012, 17:21
Сообщение #17


Участник
**

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

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




Репутация:   0  


Задача решена. У меня заработало. Выкладываю, может кому пригодиться.

1. Создаём проект GUI
2. В дизайнере выставляем label и pushButton на форуму окна программы
3. Создаём произвольный класс от класса QLabel

#ifndef L_H
#define L_H

#include <QLabel>
#include <QPainter>

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

signals:

public slots:

protected:
    void paintEvent(QPaintEvent *);

};
#endif // L_H


#include "l.h"

l::l(QWidget *parent) :
    QLabel(parent)
{
    FlagDraw = false;
}
// Вывод окружности
void l::paintEvent(QPaintEvent *)
{
    if (FlagDraw == true)
    {
        QPainter Ellipse(this);
        Ellipse.setBrush(QBrush(Qt::black));
        Ellipse.drawEllipse(0, 0, 600, 600);
    }
}


4. Класс при создании проекта имеет вид

#ifndef LDIALOG_H
#define LDIALOG_H
#include <QDialog>
#include "l.h"

namespace Ui {
    class ldialog;
}

class ldialog : public QDialog
{
    Q_OBJECT

public:
    explicit ldialog(QWidget *parent = 0);
    ~ldialog();

public slots:
    void onClick();

private:
    Ui::ldialog *ui;

};
#endif // LDIALOG_H


#include "ldialog.h"
#include "ui_ldialog.h"

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

    connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(onClick()));
}

ldialog::~ldialog()
{
    delete ui;
}
void ldialog::onClick()
{
     ui->label->FlagDraw = true;
     ui->label->update();
}


5. В Дизайнере щёлкнуть по метке Label, правой кнопкой мыши ->"Преобразовать в ..." (Promote to) и указал там класс l" и поставить галочку, там, где это будет предложено.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 22.5.2024, 8:12