crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
TiiL
  опции профиля:
сообщение 1.3.2012, 9:34
Сообщение #1


Участник
**

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

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




Репутация:   0  


Сначала о струтуре всего что делаю:
1-ое запускается приложение, по нажатию кнопки гоу запускается функция допустим fat(), какими нибудь параметрами.
2-ое функция fat() находиться в библиотеке(созданная для множества приложений), в ней ведутся вычисления, в своё время после вычислений функция вызывает функцию plot()(которая рисует графики).
вот и подошел к вопросу: поясните мне ,как подключить мою функцию plot в эту библиотеку:

что получается, разработал приложение на qwt которое рисует графики:
структура моего приложения:
Раскрывающийся текст

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent),
    ui(new Ui::MainWindow)
{    
    ui->setupUi (this);
    ui->myPlot->setTitle (QString::fromLocal8Bit ("Графики"));

    grid = new QwtPlotGrid;
    grid->enableXMin (true);
    grid->enableYMin (true);

    grid->setMajPen (QPen(Qt::black,0,Qt::DotLine));
    grid->setMinPen (QPen(Qt::gray,0,Qt::DotLine));
    grid->attach (ui->myPlot);

    ui->myPlot->canvas ()->setCursor (Qt::ArrowCursor);

    curv1 = new QwtPlotCurve(QString::fromLocal8Bit("exp(x)"));
    curv1->setRenderHint(QwtPlotItem::RenderAntialiased);
    curv1->setPen(QPen(Qt::red));

    symbol1 = new QwtSymbol();
    symbol1->setStyle (QwtSymbol::Ellipse);
    symbol1->setPen (QColor(Qt::black));
    symbol1->setSize (5);
    curv1->setSymbol (symbol1);

    curv2 = new QwtPlotCurve(QString::fromLocal8Bit ("X*X+3X"));
    curv2->setRenderHint (QwtPlotItem::RenderAntialiased);
    curv2->setPen (QPen(Qt::green));

    symbol2 = new QwtSymbol();
    symbol2->setStyle (QwtSymbol::Rect);
    symbol2->setPen (QColor(Qt::blue));
    symbol2->setSize (5);
    curv2->setSymbol (symbol2);

    leg = new QwtLegend();
    leg->setItemMode(QwtLegend::ReadOnlyItem);
    ui->myPlot->insertLegend(leg,QwtPlot::TopLegend);

    plot_fat();

    ui->myPlot->replot ();

}


имитация функции fat()
Раскрывающийся текст

void MainWindow::plot_fat ()
{
    const int N = 13;
    int n;
    int numberCurve;   
    
    double x[N+1]={1,2,3,6,8,9,11,12,13,14,18,21,22};
    //double x[N+1]={-10,-7,-6,-5,-4, -2,-1,0, 2,3,6,9,10};
    double y[N+1];
    double x2[N+1];
    double y2[N+1];
    double AxisXmax = 0;
    double AxisXmin = 0;
    double AxisYmax = 0;
    double AxisYmin = 0;
    double errorX;
    for(int k = 0; k < N; k++ )
    {

    y[k]=exp(x[k]); //первый график

    x2[k]= x[k]+ 2;
    y2[k]=x2[k]*x[k] + 3 * x2[k];  //exp(x2[k]); //второй график

//определяем минимум макимум х и у
    if(x[k] > AxisXmax) AxisXmax = x[k]; 

    if(x[k] < AxisXmin) AxisXmin = x[k];

    if(y[k] < AxisYmin) AxisYmin = y[k];

    if(y[k] > AxisYmax) AxisYmax = y[k];  

    if(x[k] < 0 ) errorX = x[k];
    }

    numberCurve = 1;

    n = plot_first(AxisXmax,AxisXmin,AxisYmax,AxisYmin,errorX,x,y,N,numberCurve);
    if( n == 0 )
    {
        numberCurve++;
        for(int k=0; k < N; k++)
        {
        x[k]=x2[k];
        y[k]=y2[k];
        }
        n = plot_next(x,y,N,numberCurve);
    }

}

имитация функции plot
Раскрывающийся текст
int MainWindow::plot_first (double AxisXmax, double AxisXmin, double AxisYmax, double AxisYmin, double errorX, double *x, double *y, const int N, int numberCurve)
{
////опре деление в каких осях рисовать в логарифмических или линейных
    //qDebug("1 i = %i", i);

    if(!ui->Log10X->isChecked () && !ui->Log10Y->isChecked ())
    {
        if(i == 1)
        {
            ui->myPlot->setAxisScaleEngine (QwtPlot::yLeft, new QwtLog10ScaleEngine);
            ui->myPlot->setAxisScaleEngine (QwtPlot::xBottom, new QwtLog10ScaleEngine);
            ui->Log10X->setChecked (true);
            ui->Log10Y->setChecked (true);
            AxisYmin=1;
            AxisXmin=1;
            if(errorX<0)
            {
                QMessageBox::warning (this,tr("Warning"),tr("There are negative values"));
            }
        }
        if(i == 2)
        {
            ui->myPlot->setAxisScaleEngine (QwtPlot::yLeft, new QwtLinearScaleEngine);
            ui->myPlot->setAxisScaleEngine (QwtPlot::xBottom, new QwtLinearScaleEngine);
        }
    }else
    {
        if(ui->Log10X->isChecked ()) AxisXmin=0.1;
        if(ui->Log10Y->isChecked ()) AxisYmin=0.1;
    }

    ui->myPlot->setAxisTitle(
        QwtPlot::xBottom,QString::fromLocal8Bit("X"));
    ui->myPlot->setAxisScale(QwtPlot::xBottom, AxisXmin, AxisXmax);

    ui->myPlot->setAxisTitle(
        QwtPlot::yLeft,QString::fromLocal8Bit("Y"));
    ui->myPlot->setAxisScale(QwtPlot::yLeft, AxisYmin, AxisYmax);

    showData(x,y,N,numberCurve);

    ui->myPlot->replot ();
    return 0;
}

int MainWindow::plot_next (double *x, double *y, const int N, int numberCurve)
{
    showData(x,y,N, numberCurve);
    ui->myPlot->replot ();
    return 1;
}



как я всё это вижу я должен разделить своё приложение на 1-ое диалоговое окно в котором всё это рисуется, 2-ое на функции которые рисуют сами линии графиков,

какой функцией будет запускать моё диологовое окно этого для меня загадка(

PS Извените если что не понятно, если что задавайте вопросы. буду отвечать

Сообщение отредактировал TiiL - 1.3.2012, 9:36
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 1.3.2012, 20:00
Сообщение #2


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

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

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




Репутация:   94  


Цитата(TiiL @ 1.3.2012, 11:34) *
как подключить мою функцию plot в эту библиотеку
что-то я не понял сути.
Чтобы функция находилась в библиотеке, нужно писать эту функцию в исходном коде библиотеки.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
TiiL
  опции профиля:
сообщение 22.3.2012, 10:44
Сообщение #3


Участник
**

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

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




Репутация:   0  


Присоединил я к проекту библиотеки свой файл содержащие функцию plot и хедер с объявлением фукнции plot_first. вот как это выглядит:

файл plot_fat():
Раскрывающийся текст
#include <mainwindow.h> // здесь объявленна plot_first 
int   plot_fat ( int spec_qty, SPEC_DATA *s, CURVE *c )
{
 вычисления...
n= plot_first("передаются какие то параметры вычисления")

}



файл mainwindow.h
Раскрывающийся текст

#ifndef MAINWINDOW_H
#define MAINWINDOW_H


#include <QtGui>
#include<QMainWindow>
//#include <qmainwindow.h>
#include <QMessageBox>
#include <QFile>
//#include <QtCore/QObject>

//хедеры qwt
#include <qwt_plot_canvas.h>
#include <qwt_plot_curve.h>
#include <qwt_plot_grid.h>
#include <qwt_symbol.h>
#include <qwt_scale_engine.h>
#include <qwt_legend.h>
//

namespace Ui{
    class MainWindow;
}
class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent =0 );
    ~MainWindow();
    void plot_fat();
    int plot_first(double AxisXmax,
                    double AxisXmin,
                    double AxisYmax,
                    double AxisYmin,
                    double errorX,
                    double *x, double *y,
                    const int N, int numberCurve);
    int plot_next(double *x, double *y,
                  const int N, int numberCurve);
    void showData(double *x, double *y,
                  /*double *x2, double *y2*/
                  const int N,int numberCurve);
    int i;

private:
    Ui::MainWindow *ui;
protected:
    QwtPlotGrid *grid;
    QwtPlotCurve *curv1,*curv2;
    QwtSymbol *symbol1, *symbol2;
    QwtLegend *leg;

    QMessageBox *error;

private slots:
    void on_Log10X_toggled();
    void on_Log10Y_toggled();

};
#endif // MAINWINDOW_H



и вылезают такие ошибки:
Раскрывающийся текст

In file included from ..\..\Qt\2010.05\qt\include/QtCore/qshareddata.h:1,

from ..\..\Qt\2010.05\qt\include/QtCore/../../src/corelib/tools/qsharedpointer.h:47,

from ..\..\Qt\2010.05\qt\include/QtCore/qsharedpointer.h:1,

from ..\..\Qt\2010.05\qt\include/QtGui/../../src/gui/image/qpixmap.h:49,

from ..\..\Qt\2010.05\qt\include/QtGui/qpixmap.h:1,

from ..\..\Qt\2010.05\qt\include/QtGui/../../src/gui/painting/qbrush.h:53,

from ..\..\Qt\2010.05\qt\include/QtGui/qbrush.h:1,

from ..\..\Qt\2010.05\qt\include/QtGui/../../src/gui/kernel/qpalette.h:47,

from ..\..\Qt\2010.05\qt\include/QtGui/qpalette.h:1,

from ..\..\Qt\2010.05\qt\include/QtGui/../../src/gui/kernel/qwidget.h:49,

from ..\..\Qt\2010.05\qt\include/QtGui/qwidget.h:1,

from ..\..\Qt\2010.05\qt\include/QtGui/../../src/gui/dialogs/qdialog.h:45,

from ..\..\Qt\2010.05\qt\include/QtGui/qdialog.h:1,

from ..\..\Qt\2010.05\qt\include\QtGui/../../src/gui/dialogs/qmessagebox.h:45,

from ..\..\Qt\2010.05\qt\include\QtGui/qmessagebox.h:1,

from ..\..\Qt\2010.05\qt\include\QtGui/QMessageBox:1,

from ./mainwindow.h:8,

from plot_fat.cpp:28:

..\..\Qt\2010.05\qt\include/QtCore/../../src/corelib/tools/qshareddata.h:165: error: expected identifier before '(' token

как быть и что делать?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
TiiL
  опции профиля:
сообщение 29.3.2012, 10:36
Сообщение #4


Участник
**

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

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




Репутация:   0  


Разобрался со своими ошибками и проблемами.

но вот почему когда я делал include <mainwindow.h> перед самой функцией plot_fat, были ошибки описанные в посте выше, а когда поставил в самое начало файла тоже самое объявление то ошибки исчезли?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
TiiL
  опции профиля:
сообщение 29.3.2012, 13:56
Сообщение #5


Участник
**

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

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




Репутация:   0  


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

вылезли вот такие ошибки:
../grathQWT/debug/libgrathQWT.a(mainwindow.o): In function `MainWindow':

C:\MyProjects\grathQWT/../../Qt/2010.05/qt/include/QtCore/../../src/corelib/arch/qatomic_i386.h:125: multiple definition of `MainWindow::MainWindow(QWidget*)'

debug/mainwindow.o:C:\MyProjects\fatigue/mainwindow.cpp:59: first defined here

../grathQWT/debug/libgrathQWT.a(mainwindow.o): In function `MainWindow':

C:\MyProjects\grathQWT/mainwindow.cpp:6: multiple definition of `MainWindow::MainWindow(QWidget*)'

debug/mainwindow.o:C:\MyProjects\fatigue/mainwindow.cpp:59: first defined here

../grathQWT/debug/libgrathQWT.a(mainwindow.o): In function `~MainWindow':

C:\MyProjects\grathQWT/mainwindow.cpp:53: multiple definition of `MainWindow::~MainWindow()'

debug/mainwindow.o:C:\MyProjects\fatigue/mainwindow.cpp:71: first defined here

../grathQWT/debug/libgrathQWT.a(mainwindow.o):C:\MyProjects\grathQWT/mainwindow.cpp:56: multiple definition of `non-virtual thunk to MainWindow::~MainWindow()'

debug/mainwindow.o:C:\MyProjects\fatigue/mainwindow.cpp:74: first defined here

../grathQWT/debug/libgrathQWT.a(mainwindow.o): In function `~MainWindow':

C:\MyProjects\grathQWT/mainwindow.cpp:53: multiple definition of `MainWindow::~MainWindow()'

debug/mainwindow.o:C:\MyProjects\fatigue/mainwindow.cpp:71: first defined here

../grathQWT/debug/libgrathQWT.a(mainwindow.o):C:\MyProjects\grathQWT/mainwindow.cpp:56: multiple definition of `non-virtual thunk to MainWindow::~MainWindow()'

debug/mainwindow.o:C:\MyProjects\fatigue/mainwindow.cpp:74: first defined here

../grathQWT/debug/libgrathQWT.a(mainwindow.o): In function `~MainWindow':

C:\MyProjects\grathQWT/mainwindow.cpp:53: multiple definition of `MainWindow::~MainWindow()'

debug/mainwindow.o:C:\MyProjects\fatigue/mainwindow.cpp:71: first defined here

collect2: ld returned 1 exit status

что интересно: когда библиотеку подключил более простому проекту
Код:
#include <QtGui/QApplication>
#include "dialog.h"


int main(int argc, char *argv[])
{
QApplication a(argc, argv);
//Dialog w;
//w.show();
MainWindow Window;


const int N = 13;
int n;
int numberCurve;

double x[N+1]={1,2,3,6,8,9,11,12,13,14,18,21,22};
//double x[N+1]={-10,-7,-6,-5,-4, -2,-1,0, 2,3,6,9,10};
double y[N+1];
double x2[N+1];
double y2[N+1];
double AxisXmax = 0;
double AxisXmin = 0;
double AxisYmax = 0;
double AxisYmin = 0;
double errorX;
for(int k = 0; k < N; k++ )
{

y[k]=exp(x[k]); //первый график

x2[k]= x[k]+ 2;
y2[k]=x2[k]*x[k] + 3 * x2[k]; //exp(x2[k]); //второй график

//определяем минимум макимум х и у
if(x[k] > AxisXmax) AxisXmax = x[k];

if(x[k] < AxisXmin) AxisXmin = x[k];

if(y[k] < AxisYmin) AxisYmin = y[k];

if(y[k] > AxisYmax) AxisYmax = y[k];

if(x[k] < 0 ) errorX = x[k];
}

numberCurve = 1;

n = Window.plot_first (AxisXmax,AxisXmin,AxisYmax,AxisYmin,errorX,x,y,N,numberCurve); //вызов моей библиотечной функции
// if( n == 0 )
// {
// numberCurve++;
// for(int k=0; k < N; k++)
// {
// x[k]=x2[k];
// y[k]=y2[k];
// }
// n = plot_next(x,y,N,numberCurve);
// }
Window.show ();


return a.exec();
}
то всё работает, есть мысль:
что приложение к которому идёт подключение библиотеки, основой является класс QMainWindow
Код:
class MainWindow : public QMainWindow

и моё библиотечное приложение идёт как
Код:
class MainWindow : public QMainWindow
{
Q_OBJECT

и из-за этого множественное объявление, может быть такое или нет?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 5.5.2025, 4:59