crossplatform.ru

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

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Нарисовать фигуру в 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();
}


Но после нажатию на кнопку эллипс не рисуется. Что я сделал не так?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 8.11.2012, 22:47
Сообщение #2


Zombie Mod
*****

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

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




Репутация:   212  


Нужно наследоваться от QLabel и предопределить функцию paintEvent(), и уже в ней рисовать.

Пример.

Сообщение отредактировал RazrFalcon - 8.11.2012, 22:48
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
zuze
  опции профиля:
сообщение 9.11.2012, 10:05
Сообщение #3


Участник
**

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

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




Репутация:   0  


RazrFalcon, большое спасибо, но чего-то не отображется всё равно, пока хочу сделать без нажатия на кннопку. То есть что бы при запуске программы, эллипс рисовался на label.

Сделал так:

ldialog.h

#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();

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);
}

ldialog::~ldialog()
{
    delete ui;
}


l.h

#ifndef L_H
#define L_H

#include <QLabel>
#include <QPainter>

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

signals:

public slots:

protected:
    void paintEvent(QPaintEvent *event);

};

#endif // L_H


l.cpp

#include "l.h"

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


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();
}


Что же опять не так?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
zuze
  опции профиля:
сообщение 9.11.2012, 17:35
Сообщение #4


Участник
**

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

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




Репутация:   0  


Как я понял я не вызвал paintEvent(). Я пытался его вызвать в конструкторе находящегося в файле ldialog.cpp. Но ни чего почему-то не вывелось?

Пробовал сделать так:


update();


Также пробовал:

this->update();
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
zuze
  опции профиля:
сообщение 9.11.2012, 19:31
Сообщение #5


Участник
**

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

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




Репутация:   0  


Тот же самый код я попробовал написать в конструкторе находящегося в файле l.cpp. Но ни чего почему-то не вывелось. А если в конструкторе в файле main.cpp добавить

l l1;
l1.show();


То рядом с открывшейся программой откроется ещё одна программа где будет только label и там эллипс отображается.
Но это не то что мне нужно, значит, где-то я ещё ошибся?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 9.11.2012, 20:50
Сообщение #6


Zombie Mod
*****

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

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




Репутация:   212  


А где в первом варианте вы предопределяете QLabel в интерефейсе?
ldialog::ldialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::ldialog)
{
    ui->setupUi(this);
}
На форму вы новый QLabel добавили?
Он должен быть отнаследован от созданного вами класса.
Так как код рисования верный. Просто сам виджет вы не используете.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
zuze
  опции профиля:
сообщение 10.11.2012, 7:07
Сообщение #7


Участник
**

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

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




Репутация:   0  


Цитата(RazrFalcon @ 9.11.2012, 20:50) *
А где в первом варианте вы предопределяете QLabel в интерефейсе?


К сожалению я не догадался это сделать.

Цитата(RazrFalcon @ 9.11.2012, 20:50) *
На форму вы новый QLabel добавили?


Нет, не добавлял, у меня на форме один QLabel.

Как я понял надо сделать QLabel от класса l? Сейчас надо подумать как это сделать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 10.11.2012, 8:48
Сообщение #8


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

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

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




Репутация:   94  


zuze, не стал читать всю тему.
У тебя по нажатии кнопки вызывается:
ui->label->update();
И зачем? Где вызов процедуры рисования?


Таки прочитал
Цитата(zuze @ 10.11.2012, 9:07) *
Как я понял надо сделать QLabel от класса l? Сейчас надо подумать как это сделать.
В Дизайнере щёлкнуть по твой метке (QLabel), правой кнопкой мыши -> "Унаследованные виджеты" (Promote to) и ввести информацию о твоём наследнике.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
zuze
  опции профиля:
сообщение 10.11.2012, 9:04
Сообщение #9


Участник
**

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

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




Репутация:   0  


Litkevich Yuriy, я пока решил хотя бы нарисовать эллипс, без нажатия, то есть сразу как запускается программа.
В конструкторе находящегося в файле ldialog.cpp добавил Ваш код вызова.

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


Но почему-то эллипс не нарисовался?

Цитата(Litkevich Yuriy @ 10.11.2012, 8:48) *
В Дизайнере щёлкнуть по твой метке (QLabel), правой кнопкой мыши -> "Унаследованные виджеты" (Promote to) и ввести информацию о твоём наследнике.


Я попытался так сделать, но в окне это-го пункта не оказалось. Привожу скриншот окна.


Скриншот окна:


Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 10.11.2012, 14:07
Сообщение #10


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

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

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




Репутация:   94  


Цитата(zuze @ 10.11.2012, 11:04) *
добавил Ваш код вызова.
это не мой код, это твой. Я его просто процитировал.

Цитата(zuze @ 10.11.2012, 11:04) *
Я попытался так сделать, но в окне это-го пункта не оказалось. Привожу скриншот окна.
Преобразовать в ...


вообще правильный путь для решения данной задачи:
Использовать один из классов (QImage, QPixmap) на нём рисуем с помощью рисовальщика (QPainter), тогда, когда нам это удобнее. Затем полученный рисунок устанавливаем в качестве изображения метки (QLabel::setPixmap()).
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 6.10.2024, 21:31