Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [QT], Рисование в frame 
:(
    Опции темы
vua72
Дата 30.11.2010, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 23.11.2010

Репутация: нет
Всего: нет



В QT новичок.
Есть простенькая задача - форма, фрейм, кнопка. По клику должен во фрейме отображать график, который читается из файла. Проблема в том, что не могу послать сигнал для рисования, в варианте, приведенном ниже, рисуется, не реагируя на кнопку.
Просьба ткнуть носом, так как запутался совсем. Заранее спасибо.
PS: не лаба smile

MyFrame.h:
Код

#ifndef MYFRAME_H
#define MYFRAME_H
#include <QFrame>
class MyFrame : public QFrame
{
    Q_OBJECT
public:
    explicit MyFrame(QWidget *parent = 0);
signals:
public slots:
protected:
    void paintEvent(QPaintEvent *e);
private:
};
#endif // MYFRAME_H


Основной виджет:
Код

#ifndef WIDGET_H
#define WIDGET_H
#include <QtGui/QWidget>
namespace Ui {
    class Widget; }
class MyFrame;
class Widget : public QWidget
{
    Q_OBJECT
public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();
protected:
    void changeEvent(QEvent *e);
private slots:
    void drawPlot();
private:
    Ui::Widget *ui;
    MyFrame *frame;
};


Код

MyFrame.cpp
#include "myframe.h"
#include <QVBoxLayout>
#include <QPixmap>
#include <QPainter>
MyFrame::MyFrame(QWidget *parent) :
    QFrame(parent)
{
}
void MyFrame::paintEvent(QPaintEvent *e)
{
    QPainter painter(this);
    painter.drawImage(10,10,QImage("test.bmp"));
    QWidget::paintEvent(e);
}

Widget.cpp
Код

#include "widget.h"
#include "myframe.h"
#include <QVBoxLayout>
#include <QPixmap>
#include <QPainter>
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    connect(ui->bnPlot, SIGNAL(clicked()), this, SLOT(drawPlot()));
    MyFrame *frame = new MyFrame;
    frame->setMaximumSize(640, 480);
    QVBoxLayout *mainLayout = new QVBoxLayout;
    mainLayout->addWidget(frame);
    setLayout(mainLayout);
    ui->setupUi(this);

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

void Widget::changeEvent(QEvent *e)
{
    QWidget::changeEvent(e);
    switch (e->type()) {
    case QEvent::LanguageChange:
        ui->retranslateUi(this);  break;
    default: break;
    }}

void Widget::drawPlot()
{    frame->update();;}




PM MAIL   Вверх
Cheloveck
Дата 30.11.2010, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: нет
Всего: 32



Цитата(vua72 @  30.11.2010,  18:03 Найти цитируемый пост)
В QT новичок.

В Quick Time?

Код

#ifndef MYFRAME_H
#define MYFRAME_H
#include <QFrame>
class MyFrame : public QFrame
{
    Q_OBJECT
public:
    explicit MyFrame(QWidget *parent = 0);
    void enablePaint(bool enable)
    {
         m_paint_enable = enable;
         // можно стереть, если отрисовка выключается.
    }
signals:
public slots:
protected:
    void paintEvent(QPaintEvent *e);
private:
    bool m_paint_enable;
};
#endif // MYFRAME_H


Код

MyFrame.cpp
#include "myframe.h"
#include <QVBoxLayout>
#include <QPixmap>
#include <QPainter>
MyFrame::MyFrame(QWidget *parent) :
    QFrame(parent),
    m_paint_eneble(false)
{
}
void MyFrame::paintEvent(QPaintEvent *e)
{
    QWidget::paintEvent(e); // сначала вызываешь родительскую отрисовку.
    if(m_paint_enable)
    {
        QPainter painter(this);
        painter.drawImage(10,10,QImage("test.bmp"));
    }

}


Код

#include "widget.h"
#include "myframe.h"
#include <QVBoxLayout>
#include <QPixmap>
#include <QPainter>
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    connect(ui->bnPlot, SIGNAL(clicked()), this, SLOT(drawPlot()));
    MyFrame *frame = new MyFrame;
    frame->setMaximumSize(640, 480);
    QVBoxLayout *mainLayout = new QVBoxLayout;
    mainLayout->addWidget(frame);
    setLayout(mainLayout);
    ui->setupUi(this);
}
Widget::~Widget()
{    delete ui;}
void Widget::changeEvent(QEvent *e)
{
    QWidget::changeEvent(e);
    switch (e->type()) {
    case QEvent::LanguageChange:
        ui->retranslateUi(this);  break;
    default: break;
    }}
void Widget::drawPlot()
{
    frame->enablePaint(true);    
    frame->update();
}


Можно так, но лучше заюзать паттерн стратегия.

Это сообщение отредактировал(а) Cheloveck - 30.11.2010, 18:40


--------------------
user posted image
PM Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0564 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.