Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Помогите с QWT
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Система рисования. Печать
werwolf
Здравствуйте, я только начинаю программировать на QT и у меня возникло несколько вопросов: как в QT использовать QWT, допустим мне надо рисовать два графика(на одном поле), я уже сделал форму, набросал виджетов и в том числе qwtPlot, а вот как его изменить, допустим добавить легенду, или изменить граници, и потом использовать (передавать координаты и цвет линий) ума не приложу. Как сделать отдельный клас, как в примере simple_plot, в котором я могу полностью настроить qwtPlot как мне нужно, а потом просто использовать его в mainwindow?
Litkevich Yuriy
Я немного рационализировал структуру Qwt (qwt-5.1.2). На основе файла %QWTDIR%/examples/examples.pri сделал %QWTDIR%/qwt.pri
qwt.pri
# -*- mode: sh -*- ################################################
# Qwt Widget Library
# Copyright (C) 1997   Josef Wilgen
# Copyright (C) 2002   Uwe Rathmann
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the Qwt License, Version 1.0
###################################################################

QWT_ROOT = $$PWD

include( $${QWT_ROOT}/qwtconfig.pri )

SUFFIX_STR =
VVERSION = $$[QT_VERSION]
isEmpty(VVERSION) {

    # Qt 3
    debug {
        SUFFIX_STR = $${DEBUG_SUFFIX}
    }
    else {
        SUFFIX_STR = $${RELEASE_SUFFIX}
    }
}
else {
    CONFIG(debug, debug|release) {
        SUFFIX_STR = $${DEBUG_SUFFIX}
    }
    else {
        SUFFIX_STR = $${RELEASE_SUFFIX}
    }
}


INCLUDEPATH += $${QWT_ROOT}/src
DEPENDPATH  += $${QWT_ROOT}/src


QWTLIB       = qwt$${SUFFIX_STR}

win32 {
    contains(CONFIG, QwtDll) {
        DEFINES    += QWT_DLL
        QWTLIB = $${QWTLIB}$${VER_MAJ}
    }

    win32-msvc:LIBS     += $${QWT_ROOT}/lib/$${QWTLIB}.lib
    win32-msvc.net:LIBS += $${QWT_ROOT}/lib/$${QWTLIB}.lib
    win32-msvc2002:LIBS += $${QWT_ROOT}/lib/$${QWTLIB}.lib
    win32-msvc2003:LIBS += $${QWT_ROOT}/lib/$${QWTLIB}.lib
    win32-msvc2005:LIBS += $${QWT_ROOT}/lib/$${QWTLIB}.lib
    win32-msvc2008:LIBS += $${QWT_ROOT}/lib/$${QWTLIB}.lib
    win32-g++:LIBS      += -L$${QWT_ROOT}/lib -l$${QWTLIB}
}
else {
    LIBS        += -L$${QWT_ROOT}/lib -l$${QWTLIB}
}

Далее так:
Назовём каталог с нашим проектом %APPDIR%
Структура будет такая:
%APPDIR%
+--/cpuplot
+--/src
где cpuplot - копия одноимённого каталога из примеров Qwt, туда я положил ещё один pri-файл:
cpuplot.pri
#=========== Files =================
HEADERS        += $${PWD}\src\background.h \
              $${PWD}\src\cpucurve.h \
              $${PWD}\src\cpuplot.h \
              $${PWD}\src\cpustat.h \
              $${PWD}\src\timescaledraw.h

SOURCES     += $${PWD}\src\cpuplot.cpp \
              $${PWD}\src\cpustat.cpp


#========= Dependency ==============
DEPENDPATH       +=    $${PWD}\src
INCLUDEPATH       +=    $${PWD}\src
#        --- Qt ---

#      --- External ---
include($$(LIBS)\qwt-5.1.2p1\qwt.pri)
здесь $$(LIBS) имя переменной окружения, т.е. у меня такая заведена LIBS=<путь к каталогу где лежат всякие сторонние библиотеки>
тепрь каталог src там лежат:
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QWidget>


class CpuPlot;

class MainWindow : public QWidget
{
    Q_OBJECT

public:
    MainWindow(QWidget *p_parent = 0);
protected:
    CpuPlot         *win;
};

#endif //MAINWINDOW_H
mainwindow.cpp
#include <QtGui>
#include "cpuplot.h"
#include "mainwindow.h"

MainWindow::MainWindow(QWidget* p_parent) : QWidget(p_parent)
{
    win = new CpuPlot(this);
    QVBoxLayout *l = new QVBoxLayout();
    l->addWidget(win);
    setLayout(l);
    setWindowTitle(tr("Снятие осцилограммы"));
}
main.cpp
#include <QApplication>
#include <QTextCodec>
#include <QLocale>
#include <QTranslator>
#include <QDir>
#include "mainwindow.h"

int main(int argc, char *argv[])
{

  QDir            dir_plugin;    // каталог плагинов
  QString        locale;        // язык локали
  QTranslator    *qttr, *apptr;        // переводчик программы
  QStringList     list_path;    // Список путей
  
    QApplication app(argc, argv);

    // Устанавливаем кодеки
    QTextCodec::setCodecForCStrings(QTextCodec::codecForLocale());
    QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8")); // Для функций перевода tr()

    // устанавливаем путь к плагинам (добавим каталог бинаря)
    dir_plugin = QDir(qApp->applicationDirPath()+"/plugins/");
    list_path << dir_plugin.absolutePath() << qApp->libraryPaths();
    qApp->setLibraryPaths(list_path);


    // Устанавливаем превод библиотек Qt
    locale = QLocale::system().name();    // запрос языка (например: "ru")
    qttr = new QTranslator;
    qttr->load(QString("qt_") + locale); // загрузка файла qt_*.qm
    qApp->installTranslator(qttr);         // установка переводчика    

    // Устанавливаем превод программы
    apptr = new QTranslator;
    apptr->load(QString("osciloscop_") + locale); // загрузка файла qt_*.qm
    qApp->installTranslator(apptr);         // установка переводчика    


    MainWindow mainWin;

    mainWin.resize(300, 300);
    mainWin.show();

    return app.exec();
}
src.pro
TARGET = myapp
TEMPLATE = app
DESTDIR = ..

CONFIG += debug_and_release build_all
CONFIG (debug, debug|release) {
    TARGET      = $$join(TARGET,,,.d)
    CONFIG        += console
}

#=========== Files =================
HEADERS           +=    mainwindow.h

SOURCES           +=    mainwindow.cpp

SOURCES           +=    main.cpp

#========= Dependency ==============
DEPENDPATH       +=    .
INCLUDEPATH       +=    .
include(../cpuplot/cpuplot.pri)

TRANSLATIONS   += $${DESTDIR}/osciloscop_ru.ts
CODECFORTR      = UTF-8

Примерно так, для использования Qwt без дизайнера.
ViGOur
Litkevich Yuriy, кандидат в вики, если немного по подробней описать, что где и как. :)
Litkevich Yuriy
Да пожалуй, можно. Но дождусь вопросов.
werwolf
Класс, но с дизайнером никаких проблем, я пользуюсь QT Creator, а в файл проекта просто прописываю INCLUDEPATH += /usr/local/qwt-5.2.0/include/
LIBS += /usr/local/qwt-5.2.0/lib/libqwt.so.5 . Вопрос вот в чом: у меня есть список точек, находится в базе, некая статистика (к примеру по У - число, а по Х - к-во совпадений) мне нужно их построить на графику, как мне сделать цикл, в котором я n раз я буду вызывать процедуру, подавая на вход значения (int X, int Y) точек на графике, что это будет за процедура.
Litkevich Yuriy
Цитата(werwolf @ 19.9.2009, 21:07) *
как в QT использовать QWT...

Цитата(werwolf @ 19.9.2009, 21:07) *
..в том числе qwtPlot, а вот как его изменить, допустим добавить легенду,..ума не приложу

Цитата(werwolf @ 19.9.2009, 21:07) *
Как сделать отдельный клас, как в примере simple_plot, в котором я могу полностью настроить qwtPlot..

Цитата(werwolf @ 20.9.2009, 0:39) *
как мне сделать цикл, в котором я n раз я буду вызывать процедуру, ... что это будет за процедура.

Честно говоря набор вопросов слишком обширный для одной темы, да и непонятен твой уровень знаний.
werwolf
Я новичок, но это только в QT, ответьте, пожалуйста, на последний вопрос.
PunX
Проблема в следующем, я скачал исходники qwt-5.2.1, выполнил qmake qwt.pro, mingw32-make. компиляция прошла без ошибок но с ворнингами вида
In file included from qwt_picker.h:20,
from qwt_panner.cpp:20:
qwt_event_pattern.h:216: warning: type attributes ignored after type is already defined
qwt_event_pattern.h:217: warning: type attributes ignored after type is already defined

и так всего порядка 46 ворнингов. После окончания компиляции получаю сообщение
Запускается C:\Qt\qwt-5.2.1\examples\bin\bode.exe...
Не удалось запустить процесс!

И в папке lib лежат два файла qwt5.dll и libqwt5.a. Как проверить работу данной библиотеки?
Litkevich Yuriy
Это ты видимо в креаторе делаешь, попробуй в командной строке. Креатор с моим приложением также себя ведёт, не понятно почему.
PunX
Всё собралось как только запустил в командной строке.
Теперь вопрос такой, я пишу приложение в Креаторе, нужно добавить область куда будет выводится график, на какой виджет размещать график?
azure
Цитата(werwolf @ 19.9.2009, 20:39) *
Класс, но с дизайнером никаких проблем, я пользуюсь QT Creator, а в файл проекта просто прописываю INCLUDEPATH += /usr/local/qwt-5.2.0/include/
LIBS += /usr/local/qwt-5.2.0/lib/libqwt.so.5 . Вопрос вот в чом: у меня есть список точек, находится в базе, некая статистика (к примеру по У - число, а по Х - к-во совпадений) мне нужно их построить на графику, как мне сделать цикл, в котором я n раз я буду вызывать процедуру, подавая на вход значения (int X, int Y) точек на графике, что это будет за процедура.


LIBS += -L"/path/to/lib/" -lqwt5
(или -lqwt, смотря как называется библиотека в вашей версии ОС)

Для постройки графика необходимо следующее:
1) создать объект QwtPlotCurve myCurve
2) ассоциировать этот объект с набором точек (см. методы SetData, SetRawData). В ващем конкретном случае я бы вначале прогнал цикл по всем вашим точкам с занесением (и преобразованием) ваших int в QVector<double> myXData и еще один для myYData, а затем вызвал бы (один раз!!) myCurve.SetData(myXData.data(),myYData.data(),myXData.size())
3) ну и наконец присоединить кривую к plot: myCurve.attach(ui->QwtPlot). После чего, возможно, потребуется сделать ui->QwtPlot->replot();

Включение\выключение легенды и прочее - это делается через методы QwtPlot.
Litkevich Yuriy
Цитата(PunX @ 14.5.2010, 22:57) *
нужно добавить область куда будет выводится график, на какой виджет размещать график?
не понял вопроса
PunX
Нужно разместить график в области выделенной чёрным прямоугольником, с помощью qwt, как это сделать? находил примеры как выводить график в отдельное окно.
Litkevich Yuriy
ну помести туда виджет-графопостроитель (QwtPlot, кажется так называется)
PunX
А есть ли пример как разместить этот виджет и задать ему размеры необходимые?
Litkevich Yuriy
Цитата(PunX @ 17.5.2010, 1:14) *
А есть ли пример как разместить этот виджет
а как ты размещаешь другие виджеты?
PunX
размещаю с помощью Креатора, в дизайнере.
fsMark
Цитата(PunX @ 16.5.2010, 22:46) *
размещаю с помощью Креатора, в дизайнере.


Открой фал формы с помощью дизайнера (<QTDIR>/bin/designer.exe) из поставки Qt, а не из креатора. Там (обычно внизу) в списке виджетов должны бить виджеты Qwt. В креаторском дизайнере этих виджетов нету потому что в стандартной поставке под винду креатор собирается студией (а Qt соответственно MinGW), а плагины для дизайнера от разных компиляторов не совместимы.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2022 IPS, Inc.