Russian Qt Forum
Ноябрь 23, 2024, 10:39 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО]qwt и главный виджет вызываемого окна  (Прочитано 8777 раз)
_Vitaliy_
Гость
« : Декабрь 13, 2009, 11:49 »

Доброго времени суток уважаемое комьюнити.
Помогите неопытному (надеюсь пока) новичку побороть qwt.
В главном окне программы вызываем еще одно окно:
Код:
void MainWindow::viewObrabotka()
{
obrabotka *pobrabotka = new obrabotka(this);
pobrabotka->setAttribute(Qt::WA_DeleteOnClose);
pobrabotka->setModel(model);
        pobrabotka->resize(800, 600);
pobrabotka->show();
}

А это код с реализацией функционала:
Код:
#include <QtGui/QStandardItemModel>

#include "obrabotka.h"
#include "mainwindow.h"

#include <qwt_plot.h>
#include <qwt_plot_marker.h>
#include <qwt_plot_curve.h>
#include <qwt_legend.h>
#include <qwt_data.h>
#include <qwt_text.h>
#include <qwt_math.h>

#include <qwt_scale_widget.h>
#include <qwt_painter.h>
#include <qwt_plot_canvas.h>

#include <math.h>

obrabotka::obrabotka(QWidget *parent)
        :QDialog(parent)
{

}

obrabotka::~obrabotka()
{
}

void obrabotka::obra()
{

}

void obrabotka::setModel(QStandardItemModel *model)
{
    m_model = model;

        QList<double> x0, x1, x2, x3;
        int Size = m_model->rowCount();
        double X0[Size], X1[Size], X2[Size], X3[Size];


    for (int i = 0; i < m_model->rowCount(); i++) {
                x0.append(m_model->item(i, 0)->text().toDouble());
                x1.append(m_model->item(i, 1)->text().toDouble());
                x2.append(m_model->item(i, 2)->text().toDouble());
              
    }

        for (int i = 0; i < m_model->rowCount(); i++) {
                X0[i] = x0[i];
                X1[i] = x1[i];
                X2[i] = x2[i];
        }

//******* Grafiki *****
    QwtPlot *myPlot = new QwtPlot(tr("Grafiki zavisimosti parametrov ot vremeni"), this);
    
    // add curves
    QwtPlotCurve *curve1 = new QwtPlotCurve("H ot T");
    curve1->setRenderHint(QwtPlotItem::RenderAntialiased);
    QwtPlotCurve *curve2 = new QwtPlotCurve("Curve 2");

        // Axis of plot
        myPlot->setAxisTitle(QwtPlot::xBottom, "Time/seconds");
        myPlot->setAxisTitle(QwtPlot::yLeft, "Height/meters");
      
    curve1->setPen(QPen(Qt::red));
    curve2->setPen(QPen(Qt::blue));

    curve1->setData(X0,X1,Size);
    curve2->setData(X0,X2,Size);

    curve1->attach(myPlot);
    curve2->attach(myPlot);

    // finally, refresh the plot
    myPlot->resize(600, 500);
    myPlot->replot();
//*************
}
Вроде сам график выводить научился, образования хватило... а дальше темный лес.
Необходимо:
1. График должен растягиваться на все окно (окно, в котором он выводится) и при изменении размеров окна он тоже должен изменяться. Вроде нужно было правильно унаследовать: QwtPlot *myPlot = new QwtPlot(tr("Grafiki zavisimosti parametrov ot vremeni"), this) но у меня не получилось. В примере simpleplot это вроде понятно..., а когда несколько окон, как у меня, я честно говоря недопонимаю...

Т.к. это типичный вопрос "юзабильности" qwt, то потом это пост (если добъем его совместными усилиями) можно будет выложить в ВИКИ или в уроки дабы новички, такие как я, могли найти ответ.
« Последнее редактирование: Декабрь 17, 2009, 22:25 от _Vitaliy_ » Записан
_Vitaliy_
Гость
« Ответ #1 : Декабрь 14, 2009, 00:01 »

Наверное попробую задавать наводящие вопросы:
В главном окне программы я вызываю например так:
Код:
void MainWindow::FlyFile()
{
QDialog *dialog = new QDialog(this);
dialog->setAttribute(Qt::WA_DeleteOnClose);
dialog->resize(800, 600);

QTableView *view = new QTableView(dialog);
view->setModel(model);

QVBoxLayout *layout = new QVBoxLayout();
layout->addWidget(view);
dialog->setLayout(layout);
dialog->show();
}

т.к. TableView единственный "элемент" то он будет на все окно и изменяя окно он соответственно так же изменяется.
У меня
Код:
QwtPlot *myPlot = new QwtPlot(tr("Grafiki zavisimosti parametrov ot vremeni"), this);
определяется в модуле obrabotka если его описать в главном окне то теоретически все будет правильно но как это сделать? чтобы оно работало?
« Последнее редактирование: Декабрь 15, 2009, 21:14 от _Vitaliy_ » Записан
_Vitaliy_
Гость
« Ответ #2 : Декабрь 15, 2009, 16:37 »

Если в коде вызова окна будет вот так:
Код:
void MainWindow::viewObrabotka()
{
    obrabotka *pobrabotka = new obrabotka(this);
    pobrabotka->setAttribute(Qt::WA_DeleteOnClose);
    pobrabotka->setWindowTitle("Grafiki zavisimostey parametrov ot vremeni");
    pobrabotka->setModel(model);
    pobrabotka->resize(800, 600);

    //QwtPlot *myPlot = new QwtPlot(this);
    //QVBoxLayout *layout = new QVBoxLayout();
    //layout->addWidget(myPlot);
    //pobrabotka->setLayout(layout);

pobrabotka->show();
}

и объявление как в коде первого сообщения:
Код:
void obrabotka::setModel(QStandardItemModel *model)
{
...
//******* Grafiki *****
    QwtPlot *myPlot = new QwtPlot(tr("Grafiki zavisimosti parametrov ot vremeni"), this);
    
    // add curves
...

то на выходе будем иметь: (атач 11.пнг)
если разремить
Код:
void MainWindow::viewObrabotka()
{
    obrabotka *pobrabotka = new obrabotka(this);
    pobrabotka->setAttribute(Qt::WA_DeleteOnClose);
    pobrabotka->setWindowTitle("Grafiki zavisimostey parametrov ot vremeni");
    pobrabotka->setModel(model);
    pobrabotka->resize(800, 600);

    QwtPlot *myPlot = new QwtPlot(this);
    QVBoxLayout *layout = new QVBoxLayout();
    layout->addWidget(myPlot);
    pobrabotka->setLayout(layout);

pobrabotka->show();
}
код получается логически неправильным но показывает суть проблемы.
Получается что происходит накладка (атач 22.пнг), т.е. сверху получается такой как надо, т.е. реагирует на изменение окна, а на заднем фоне реальный, который строит графики... вот его мне и надо растянуть на все окно... Непонимающий
« Последнее редактирование: Декабрь 15, 2009, 21:14 от _Vitaliy_ » Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #3 : Декабрь 16, 2009, 00:31 »

Думаю никто не отвечает т.к. невозможно понять что ты хочешь - что получается а что нет - и вообще такое ощущение что вопрос не в QWT а в Qt-шных лейаутах и способах выравнивания виджетов, но все же в нашем проекте есть одна программа написанная на Qwt - писал ее пользователь этого форума "Varan" - там несколько Qwt графиков по горизонтальной оси растянуты - работает одновременное скроллирование, изменение масштаба, все оптимизировано, ничего не тормозит, саму программу дать не могу, прилагаю скриншот и обратитесь к "Varan" - если вопрос действительно в Qwt
Записан
_Vitaliy_
Гость
« Ответ #4 : Декабрь 16, 2009, 13:09 »

Я скорее всего накосячил с именно относительно с кьюте и определением 
Код:
QwtPlot *myPlot = new QwtPlot(tr("Grafiki zavisimosti parametrov ot vremeni"), this);
в дочернем окне если бы в главном окне было это объявление, то все бы заработало, но если его объявить в главном, и в дочернем убрать, то выдает ошибку что все что данные этого класса не определены...Непонимающий
За
Цитировать
есть одна программа написанная на Qwt - писал ее пользователь этого форума "Varan"
спасибо, надо будет посмотреть
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #5 : Декабрь 16, 2009, 18:29 »

Цитировать
в дочернем окне если бы в главном окне было это объявление, то все бы заработало, но если его объявить в главном, и в дочернем убрать, то выдает
хрен чего могу понять...
Записан
_Vitaliy_
Гость
« Ответ #6 : Декабрь 16, 2009, 18:32 »

Цитировать
пользователь этого форума "Varan"
. А вы не кинете линк на форуме на этот проект а то я по поиску нашел "Varan" но там ветка совсем не по кьювт. Да и мыла я у него не нашел на личной страничке. Правильное решение уже найдено, через час с небольшим кину ответ.
 
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #7 : Декабрь 16, 2009, 19:30 »

Цитировать
А вы не кинете линк на форуме на этот проект
программа НЕ опен сорс и линка никакого нет - если есть вопросы по Qwt у Varan можешь спрашивать...
Записан
_Vitaliy_
Гость
« Ответ #8 : Декабрь 16, 2009, 22:00 »

как говориться "ларчик просто открывался" ©. Т.к. у меня
Код:
QwtPlot *myPlot = new QwtPlot(tr("Grafiki zavisimosti parametrov ot vremeni"), this);
был описан не в конструкторе дочернего окна, то соответственно и виделся только в той функции где был описан, а именно в
Код:
void obrabotka::setModel(QStandardItemModel *model)
. Поэтому внеся дополнения в obrabotka.h
Код:
class obrabotka : public QDialog
{
...
private:
 QwtPlot *plot;
}
в obrabotka.cpp
Код:
obrabotka::obrabotka(QWidget *parent)
:QDialog(parent)
{
    plot = new QwtPlot();

     QVBoxLayout *l = new QVBoxLayout();
     l->addWidget(plot);

     setLayout(l);
и убрав из
Код:
void obrabotka::setModel(QStandardItemModel *model)
{
m_model = model;
...
}
QwtPlot *myPlot = new QwtPlot(this);
все заработало.
Ошибка в принципе была банальной, спасибо Пантеру (переписка в личке) за подсказку. Наверное здесь я ее плохо описал, поэтому и было непонятно чего я хочу... Но все равно спасибо за соучастие.
Записан
_Vitaliy_
Гость
« Ответ #9 : Декабрь 16, 2009, 22:57 »

тема закрыта
« Последнее редактирование: Декабрь 17, 2009, 22:24 от _Vitaliy_ » Записан
Sergey
Гость
« Ответ #10 : Июль 06, 2010, 13:18 »

qwt собран релизом ..... но всё равно вылетает и пишет такую ошибку
 
"Microsoft Visual C++ Runtime Library
Runtime Error!
This application has requested the Runtime to terminate it in an unusual way. Please contact the application's support team for more information."

сделал отладку  , получил следующее сообщение :
QWidget: Must construct a QApplication before a QPaintDevice

подскажите как исправить.пожалуйста
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.132 секунд. Запросов: 23.