You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
815 lines
34 KiB
815 lines
34 KiB
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
|
|
<!-- /home/espenr/tmp/qt-3.3.8-espenr-2499/qt-x11-free-3.3.8/examples/chart/chart.doc:1 -->
|
|
<html>
|
|
<head>
|
|
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
|
<title>A Complete Canvas Application</title>
|
|
<style type="text/css"><!--
|
|
fn { margin-left: 1cm; text-indent: -1cm; }
|
|
a:link { color: #004faf; text-decoration: none }
|
|
a:visited { color: #672967; text-decoration: none }
|
|
body { background: #ffffff; color: black; }
|
|
--></style>
|
|
</head>
|
|
<body>
|
|
|
|
<table border="0" cellpadding="0" cellspacing="0" width="100%">
|
|
<tr bgcolor="#E5E5E5">
|
|
<td valign=center>
|
|
<a href="index.html">
|
|
<font color="#004faf">Home</font></a>
|
|
| <a href="classes.html">
|
|
<font color="#004faf">All Classes</font></a>
|
|
| <a href="mainclasses.html">
|
|
<font color="#004faf">Main Classes</font></a>
|
|
| <a href="annotated.html">
|
|
<font color="#004faf">Annotated</font></a>
|
|
| <a href="groups.html">
|
|
<font color="#004faf">Grouped Classes</font></a>
|
|
| <a href="functions.html">
|
|
<font color="#004faf">Functions</font></a>
|
|
</td>
|
|
<td align="right" valign="center"><img src="logo32.png" align="right" width="64" height="32" border="0"></td></tr></table><h1 align=center>A Complete Canvas Application</h1>
|
|
|
|
|
|
|
|
<p>
|
|
<p> This is a complete example program with a main window, menus and
|
|
toolbars. The main widget is a <a href="ntqcanvas.html">TQCanvas</a>, and this example
|
|
demonstrates basic canvas usage.
|
|
|
|
<p> <hr>
|
|
<p> Project file:
|
|
<p> <pre>TEMPLATE = app
|
|
|
|
CONFIG += warn_on
|
|
|
|
REQUIRES = full-config
|
|
|
|
HEADERS += element.h \
|
|
canvastext.h \
|
|
canvasview.h \
|
|
chartform.h \
|
|
optionsform.h \
|
|
setdataform.h
|
|
SOURCES += element.cpp \
|
|
canvasview.cpp \
|
|
chartform.cpp \
|
|
chartform_canvas.cpp \
|
|
chartform_files.cpp \
|
|
optionsform.cpp \
|
|
setdataform.cpp \
|
|
main.cpp
|
|
</pre>
|
|
|
|
<p> <hr>
|
|
<p> Header files:
|
|
<p> <pre>#ifndef ELEMENT_H
|
|
#define ELEMENT_H
|
|
|
|
#include <<a href="qcolor-h.html">ntqcolor.h</a>>
|
|
#include <<a href="qnamespace-h.html">ntqnamespace.h</a>>
|
|
#include <<a href="qstring-h.html">ntqstring.h</a>>
|
|
#include <<a href="qvaluevector-h.html">ntqvaluevector.h</a>>
|
|
|
|
class Element;
|
|
|
|
typedef TQValueVector<Element> ElementVector;
|
|
|
|
/*
|
|
Elements are valid if they have a value which is > EPSILON.
|
|
*/
|
|
const double EPSILON = 0.0000001; // Must be > INVALID.
|
|
|
|
|
|
class Element
|
|
{
|
|
public:
|
|
enum { INVALID = -1 };
|
|
enum { NO_PROPORTION = -1 };
|
|
enum { MAX_PROPOINTS = 3 }; // One proportional point per chart type
|
|
|
|
Element( double value = INVALID, TQColor valueColor = TQt::gray,
|
|
int valuePattern = TQt::SolidPattern,
|
|
const <a href="ntqstring.html">TQString</a>& label = <a href="ntqstring.html#TQString-null">TQString::null</a>,
|
|
<a href="ntqcolor.html">TQColor</a> labelColor = TQt::black ) {
|
|
init( value, valueColor, valuePattern, label, labelColor );
|
|
for ( int i = 0; i < MAX_PROPOINTS * 2; ++i )
|
|
m_propoints[i] = NO_PROPORTION;
|
|
}
|
|
~Element() {}
|
|
|
|
bool isValid() const { return m_value > EPSILON; }
|
|
|
|
double value() const { return m_value; }
|
|
<a href="ntqcolor.html">TQColor</a> valueColor() const { return m_valueColor; }
|
|
int valuePattern() const { return m_valuePattern; }
|
|
<a href="ntqstring.html">TQString</a> label() const { return m_label; }
|
|
<a href="ntqcolor.html">TQColor</a> labelColor() const { return m_labelColor; }
|
|
double proX( int index ) const;
|
|
double proY( int index ) const;
|
|
|
|
void set( double value = INVALID, TQColor valueColor = TQt::gray,
|
|
int valuePattern = TQt::SolidPattern,
|
|
const <a href="ntqstring.html">TQString</a>& label = TQString::null,
|
|
<a href="ntqcolor.html">TQColor</a> labelColor = TQt::black ) {
|
|
init( value, valueColor, valuePattern, label, labelColor );
|
|
}
|
|
void setValue( double value ) { m_value = value; }
|
|
void setValueColor( <a href="ntqcolor.html">TQColor</a> valueColor ) { m_valueColor = valueColor; }
|
|
void setValuePattern( int valuePattern );
|
|
void setLabel( const <a href="ntqstring.html">TQString</a>& label ) { m_label = label; }
|
|
void setLabelColor( <a href="ntqcolor.html">TQColor</a> labelColor ) { m_labelColor = labelColor; }
|
|
void setProX( int index, double value );
|
|
void setProY( int index, double value );
|
|
|
|
#ifdef TQ_FULL_TEMPLATE_INSTANTIATION
|
|
// xlC 3.x workaround
|
|
TQ_DUMMY_COMPARISON_OPERATOR(Element)
|
|
bool operator!=( const Element& e) const {
|
|
return ( !(e == *this) );
|
|
}
|
|
#endif
|
|
|
|
private:
|
|
void init( double value, TQColor valueColor, int valuePattern,
|
|
const <a href="ntqstring.html">TQString</a>& label, TQColor labelColor );
|
|
|
|
double m_value;
|
|
<a href="ntqcolor.html">TQColor</a> m_valueColor;
|
|
int m_valuePattern;
|
|
<a href="ntqstring.html">TQString</a> m_label;
|
|
<a href="ntqcolor.html">TQColor</a> m_labelColor;
|
|
double m_propoints[2 * MAX_PROPOINTS];
|
|
};
|
|
|
|
|
|
TQTextStream &operator<<( <a href="ntqtextstream.html">TQTextStream</a>&, const Element& );
|
|
TQTextStream &operator>>( <a href="ntqtextstream.html">TQTextStream</a>&, Element& );
|
|
|
|
#endif
|
|
</pre>
|
|
|
|
<pre>#ifndef CHARTFORM_H
|
|
#define CHARTFORM_H
|
|
|
|
#include "element.h"
|
|
|
|
#include <<a href="qmainwindow-h.html">ntqmainwindow.h</a>>
|
|
#include <<a href="qstringlist-h.html">ntqstringlist.h</a>>
|
|
|
|
|
|
class CanvasView;
|
|
|
|
class TQAction;
|
|
class TQCanvas;
|
|
class TQFont;
|
|
class TQPrinter;
|
|
class TQString;
|
|
|
|
|
|
class ChartForm: public <a href="ntqmainwindow.html">TQMainWindow</a>
|
|
{
|
|
<a href="metaobjects.html#TQ_OBJECT">TQ_OBJECT</a>
|
|
public:
|
|
enum { MAX_ELEMENTS = 100 };
|
|
enum { MAX_RECENTFILES = 9 }; // Must not exceed 9
|
|
enum ChartType { PIE, VERTICAL_BAR, HORIZONTAL_BAR };
|
|
enum AddValuesType { NO, YES, AS_PERCENTAGE };
|
|
|
|
ChartForm( const <a href="ntqstring.html">TQString</a>& filename );
|
|
~ChartForm();
|
|
|
|
int chartType() { return m_chartType; }
|
|
void setChanged( bool changed = TRUE ) { m_changed = changed; }
|
|
void drawElements();
|
|
|
|
<a href="ntqpopupmenu.html">TQPopupMenu</a> *optionsMenu; // Why public? See canvasview.cpp
|
|
|
|
protected:
|
|
virtual void closeEvent( <a href="qcloseevent.html">TQCloseEvent</a> * );
|
|
|
|
private slots:
|
|
void fileNew();
|
|
void fileOpen();
|
|
void fileOpenRecent( int index );
|
|
void fileSave();
|
|
void fileSaveAs();
|
|
void fileSaveAsPixmap();
|
|
void filePrint();
|
|
void fileQuit();
|
|
void optionsSetData();
|
|
void updateChartType( <a href="ntqaction.html">TQAction</a> *action );
|
|
void optionsSetFont();
|
|
void optionsSetOptions();
|
|
void helpHelp();
|
|
void helpAbout();
|
|
void helpAboutTQt();
|
|
void saveOptions();
|
|
|
|
private:
|
|
void init();
|
|
void load( const <a href="ntqstring.html">TQString</a>& filename );
|
|
bool okToClear();
|
|
void drawPieChart( const double scales[], double total, int count );
|
|
void drawVerticalBarChart( const double scales[], double total, int count );
|
|
void drawHorizontalBarChart( const double scales[], double total, int count );
|
|
|
|
<a href="ntqstring.html">TQString</a> valueLabel( const <a href="ntqstring.html">TQString</a>& label, double value, double total );
|
|
void updateRecentFiles( const <a href="ntqstring.html">TQString</a>& filename );
|
|
void updateRecentFilesMenu();
|
|
void setChartType( ChartType chartType );
|
|
|
|
<a href="ntqpopupmenu.html">TQPopupMenu</a> *fileMenu;
|
|
<a href="ntqaction.html">TQAction</a> *optionsPieChartAction;
|
|
<a href="ntqaction.html">TQAction</a> *optionsHorizontalBarChartAction;
|
|
<a href="ntqaction.html">TQAction</a> *optionsVerticalBarChartAction;
|
|
|
|
|
|
<a href="ntqstring.html">TQString</a> m_filename;
|
|
<a href="ntqstringlist.html">TQStringList</a> m_recentFiles;
|
|
<a href="ntqcanvas.html">TQCanvas</a> *m_canvas;
|
|
CanvasView *m_canvasView;
|
|
bool m_changed;
|
|
ElementVector m_elements;
|
|
<a href="ntqprinter.html">TQPrinter</a> *m_printer;
|
|
ChartType m_chartType;
|
|
AddValuesType m_addValues;
|
|
int m_decimalPlaces;
|
|
<a href="ntqfont.html">TQFont</a> m_font;
|
|
};
|
|
|
|
#endif
|
|
</pre>
|
|
|
|
<p> <hr>
|
|
<p> Implementation:
|
|
<p> <pre>#include "canvasview.h"
|
|
#include "chartform.h"
|
|
#include "optionsform.h"
|
|
#include "setdataform.h"
|
|
|
|
#include <<a href="qaction-h.html">ntqaction.h</a>>
|
|
#include <<a href="qapplication-h.html">ntqapplication.h</a>>
|
|
#include <<a href="qcombobox-h.html">ntqcombobox.h</a>>
|
|
#include <<a href="qfile-h.html">ntqfile.h</a>>
|
|
#include <<a href="qfiledialog-h.html">ntqfiledialog.h</a>>
|
|
#include <<a href="qfont-h.html">ntqfont.h</a>>
|
|
#include <<a href="qfontdialog-h.html">ntqfontdialog.h</a>>
|
|
#include <<a href="qmenubar-h.html">ntqmenubar.h</a>>
|
|
#include <<a href="qmessagebox-h.html">ntqmessagebox.h</a>>
|
|
#include <<a href="qpixmap-h.html">ntqpixmap.h</a>>
|
|
#include <<a href="qpopupmenu-h.html">ntqpopupmenu.h</a>>
|
|
#include <<a href="qprinter-h.html">ntqprinter.h</a>>
|
|
#include <<a href="qradiobutton-h.html">ntqradiobutton.h</a>>
|
|
#include <<a href="qsettings-h.html">ntqsettings.h</a>>
|
|
#include <<a href="qspinbox-h.html">ntqspinbox.h</a>>
|
|
#include <<a href="qstatusbar-h.html">ntqstatusbar.h</a>>
|
|
#include <<a href="qtoolbar-h.html">ntqtoolbar.h</a>>
|
|
#include <<a href="qtoolbutton-h.html">ntqtoolbutton.h</a>>
|
|
|
|
#include "images/file_new.xpm"
|
|
#include "images/file_open.xpm"
|
|
#include "images/file_save.xpm"
|
|
#include "images/file_print.xpm"
|
|
#include "images/options_setdata.xpm"
|
|
#include "images/options_setfont.xpm"
|
|
#include "images/options_setoptions.xpm"
|
|
#include "images/options_horizontalbarchart.xpm"
|
|
#include "images/options_piechart.xpm"
|
|
#include "images/options_verticalbarchart.xpm"
|
|
|
|
|
|
const <a href="ntqstring.html">TQString</a> WINDOWS_REGISTRY = "/Trolltech/TQtExamples";
|
|
const <a href="ntqstring.html">TQString</a> APP_KEY = "/Chart/";
|
|
|
|
|
|
<a name="f596"></a>ChartForm::ChartForm( const <a href="ntqstring.html">TQString</a>& filename )
|
|
: <a href="ntqmainwindow.html">TQMainWindow</a>( 0, 0, WDestructiveClose )
|
|
{
|
|
<a href="ntqwidget.html#setIcon">setIcon</a>( TQPixmap( options_piechart ) );
|
|
|
|
<a href="ntqaction.html">TQAction</a> *fileNewAction;
|
|
<a href="ntqaction.html">TQAction</a> *fileOpenAction;
|
|
<a href="ntqaction.html">TQAction</a> *fileSaveAction;
|
|
<a href="ntqaction.html">TQAction</a> *fileSaveAsAction;
|
|
<a href="ntqaction.html">TQAction</a> *fileSaveAsPixmapAction;
|
|
<a href="ntqaction.html">TQAction</a> *filePrintAction;
|
|
<a href="ntqaction.html">TQAction</a> *fileQuitAction;
|
|
<a href="ntqaction.html">TQAction</a> *optionsSetDataAction;
|
|
<a href="ntqaction.html">TQAction</a> *optionsSetFontAction;
|
|
<a href="ntqaction.html">TQAction</a> *optionsSetOptionsAction;
|
|
|
|
fileNewAction = new <a href="ntqaction.html">TQAction</a>(
|
|
"New Chart", TQPixmap( file_new ),
|
|
"&New", CTRL+Key_N, this, "new" );
|
|
<a name="x2869"></a> <a href="ntqobject.html#connect">connect</a>( fileNewAction, TQ_SIGNAL( <a href="ntqaction.html#activated">activated</a>() ), this, TQ_SLOT( fileNew() ) );
|
|
|
|
fileOpenAction = new <a href="ntqaction.html">TQAction</a>(
|
|
"Open Chart", TQPixmap( file_open ),
|
|
"&Open...", CTRL+Key_O, this, "open" );
|
|
<a href="ntqobject.html#connect">connect</a>( fileOpenAction, TQ_SIGNAL( <a href="ntqaction.html#activated">activated</a>() ), this, TQ_SLOT( fileOpen() ) );
|
|
|
|
fileSaveAction = new <a href="ntqaction.html">TQAction</a>(
|
|
"Save Chart", TQPixmap( file_save ),
|
|
"&Save", CTRL+Key_S, this, "save" );
|
|
<a href="ntqobject.html#connect">connect</a>( fileSaveAction, TQ_SIGNAL( <a href="ntqaction.html#activated">activated</a>() ), this, TQ_SLOT( fileSave() ) );
|
|
|
|
fileSaveAsAction = new <a href="ntqaction.html">TQAction</a>(
|
|
"Save Chart As", TQPixmap( file_save ),
|
|
"Save &As...", 0, this, "save as" );
|
|
<a href="ntqobject.html#connect">connect</a>( fileSaveAsAction, TQ_SIGNAL( <a href="ntqaction.html#activated">activated</a>() ),
|
|
this, TQ_SLOT( fileSaveAs() ) );
|
|
|
|
fileSaveAsPixmapAction = new <a href="ntqaction.html">TQAction</a>(
|
|
"Save Chart As Bitmap", TQPixmap( file_save ),
|
|
"Save As &Bitmap...", CTRL+Key_B, this, "save as bitmap" );
|
|
<a href="ntqobject.html#connect">connect</a>( fileSaveAsPixmapAction, TQ_SIGNAL( <a href="ntqaction.html#activated">activated</a>() ),
|
|
this, TQ_SLOT( fileSaveAsPixmap() ) );
|
|
|
|
filePrintAction = new <a href="ntqaction.html">TQAction</a>(
|
|
"Print Chart", TQPixmap( file_print ),
|
|
"&Print Chart...", CTRL+Key_P, this, "print chart" );
|
|
<a href="ntqobject.html#connect">connect</a>( filePrintAction, TQ_SIGNAL( <a href="ntqaction.html#activated">activated</a>() ),
|
|
this, TQ_SLOT( filePrint() ) );
|
|
|
|
optionsSetDataAction = new <a href="ntqaction.html">TQAction</a>(
|
|
"Set Data", TQPixmap( options_setdata ),
|
|
"Set &Data...", CTRL+Key_D, this, "set data" );
|
|
<a href="ntqobject.html#connect">connect</a>( optionsSetDataAction, TQ_SIGNAL( <a href="ntqaction.html#activated">activated</a>() ),
|
|
this, TQ_SLOT( optionsSetData() ) );
|
|
|
|
|
|
<a href="qactiongroup.html">TQActionGroup</a> *chartGroup = new <a href="qactiongroup.html">TQActionGroup</a>( this ); // Connected later
|
|
<a name="x2874"></a> chartGroup-><a href="qactiongroup.html#setExclusive">setExclusive</a>( TRUE );
|
|
|
|
optionsPieChartAction = new <a href="ntqaction.html">TQAction</a>(
|
|
"Pie Chart", TQPixmap( options_piechart ),
|
|
"&Pie Chart", CTRL+Key_I, chartGroup, "pie chart" );
|
|
<a name="x2872"></a> optionsPieChartAction-><a href="ntqaction.html#setToggleAction">setToggleAction</a>( TRUE );
|
|
|
|
optionsHorizontalBarChartAction = new <a href="ntqaction.html">TQAction</a>(
|
|
"Horizontal Bar Chart", TQPixmap( options_horizontalbarchart ),
|
|
"&Horizontal Bar Chart", CTRL+Key_H, chartGroup,
|
|
"horizontal bar chart" );
|
|
optionsHorizontalBarChartAction-><a href="ntqaction.html#setToggleAction">setToggleAction</a>( TRUE );
|
|
|
|
optionsVerticalBarChartAction = new <a href="ntqaction.html">TQAction</a>(
|
|
"Vertical Bar Chart", TQPixmap( options_verticalbarchart ),
|
|
"&Vertical Bar Chart", CTRL+Key_V, chartGroup, "Vertical bar chart" );
|
|
optionsVerticalBarChartAction-><a href="ntqaction.html#setToggleAction">setToggleAction</a>( TRUE );
|
|
|
|
|
|
optionsSetFontAction = new <a href="ntqaction.html">TQAction</a>(
|
|
"Set Font", TQPixmap( options_setfont ),
|
|
"Set &Font...", CTRL+Key_F, this, "set font" );
|
|
<a href="ntqobject.html#connect">connect</a>( optionsSetFontAction, TQ_SIGNAL( <a href="ntqaction.html#activated">activated</a>() ),
|
|
this, TQ_SLOT( optionsSetFont() ) );
|
|
|
|
optionsSetOptionsAction = new <a href="ntqaction.html">TQAction</a>(
|
|
"Set Options", TQPixmap( options_setoptions ),
|
|
"Set &Options...", 0, this, "set options" );
|
|
<a href="ntqobject.html#connect">connect</a>( optionsSetOptionsAction, TQ_SIGNAL( <a href="ntqaction.html#activated">activated</a>() ),
|
|
this, TQ_SLOT( optionsSetOptions() ) );
|
|
|
|
fileQuitAction = new <a href="ntqaction.html">TQAction</a>( "Quit", "&Quit", CTRL+Key_Q, this, "quit" );
|
|
<a href="ntqobject.html#connect">connect</a>( fileQuitAction, TQ_SIGNAL( <a href="ntqaction.html#activated">activated</a>() ), this, TQ_SLOT( fileQuit() ) );
|
|
|
|
|
|
<a href="ntqtoolbar.html">TQToolBar</a>* fileTools = new <a href="ntqtoolbar.html">TQToolBar</a>( this, "file operations" );
|
|
<a name="x2895"></a> fileTools-><a href="ntqtoolbar.html#setLabel">setLabel</a>( "File Operations" );
|
|
<a name="x2870"></a> fileNewAction-><a href="ntqaction.html#addTo">addTo</a>( fileTools );
|
|
fileOpenAction-><a href="ntqaction.html#addTo">addTo</a>( fileTools );
|
|
fileSaveAction-><a href="ntqaction.html#addTo">addTo</a>( fileTools );
|
|
<a name="x2894"></a> fileTools-><a href="ntqtoolbar.html#addSeparator">addSeparator</a>();
|
|
filePrintAction-><a href="ntqaction.html#addTo">addTo</a>( fileTools );
|
|
|
|
<a href="ntqtoolbar.html">TQToolBar</a> *optionsTools = new <a href="ntqtoolbar.html">TQToolBar</a>( this, "options operations" );
|
|
optionsTools-><a href="ntqtoolbar.html#setLabel">setLabel</a>( "Options Operations" );
|
|
optionsSetDataAction-><a href="ntqaction.html#addTo">addTo</a>( optionsTools );
|
|
optionsTools-><a href="ntqtoolbar.html#addSeparator">addSeparator</a>();
|
|
optionsPieChartAction-><a href="ntqaction.html#addTo">addTo</a>( optionsTools );
|
|
optionsHorizontalBarChartAction-><a href="ntqaction.html#addTo">addTo</a>( optionsTools );
|
|
optionsVerticalBarChartAction-><a href="ntqaction.html#addTo">addTo</a>( optionsTools );
|
|
optionsTools-><a href="ntqtoolbar.html#addSeparator">addSeparator</a>();
|
|
optionsSetFontAction-><a href="ntqaction.html#addTo">addTo</a>( optionsTools );
|
|
optionsTools-><a href="ntqtoolbar.html#addSeparator">addSeparator</a>();
|
|
optionsSetOptionsAction-><a href="ntqaction.html#addTo">addTo</a>( optionsTools );
|
|
|
|
fileMenu = new <a href="ntqpopupmenu.html">TQPopupMenu</a>( this );
|
|
<a href="ntqmainwindow.html#menuBar">menuBar</a>()->insertItem( "&File", fileMenu );
|
|
fileNewAction-><a href="ntqaction.html#addTo">addTo</a>( fileMenu );
|
|
fileOpenAction-><a href="ntqaction.html#addTo">addTo</a>( fileMenu );
|
|
fileSaveAction-><a href="ntqaction.html#addTo">addTo</a>( fileMenu );
|
|
fileSaveAsAction-><a href="ntqaction.html#addTo">addTo</a>( fileMenu );
|
|
fileMenu-><a href="ntqmenudata.html#insertSeparator">insertSeparator</a>();
|
|
fileSaveAsPixmapAction-><a href="ntqaction.html#addTo">addTo</a>( fileMenu );
|
|
fileMenu-><a href="ntqmenudata.html#insertSeparator">insertSeparator</a>();
|
|
filePrintAction-><a href="ntqaction.html#addTo">addTo</a>( fileMenu );
|
|
fileMenu-><a href="ntqmenudata.html#insertSeparator">insertSeparator</a>();
|
|
fileQuitAction-><a href="ntqaction.html#addTo">addTo</a>( fileMenu );
|
|
|
|
optionsMenu = new <a href="ntqpopupmenu.html">TQPopupMenu</a>( this );
|
|
<a href="ntqmainwindow.html#menuBar">menuBar</a>()->insertItem( "&Options", optionsMenu );
|
|
optionsSetDataAction-><a href="ntqaction.html#addTo">addTo</a>( optionsMenu );
|
|
optionsMenu-><a href="ntqmenudata.html#insertSeparator">insertSeparator</a>();
|
|
optionsPieChartAction-><a href="ntqaction.html#addTo">addTo</a>( optionsMenu );
|
|
optionsHorizontalBarChartAction-><a href="ntqaction.html#addTo">addTo</a>( optionsMenu );
|
|
optionsVerticalBarChartAction-><a href="ntqaction.html#addTo">addTo</a>( optionsMenu );
|
|
optionsMenu-><a href="ntqmenudata.html#insertSeparator">insertSeparator</a>();
|
|
optionsSetFontAction-><a href="ntqaction.html#addTo">addTo</a>( optionsMenu );
|
|
optionsMenu-><a href="ntqmenudata.html#insertSeparator">insertSeparator</a>();
|
|
optionsSetOptionsAction-><a href="ntqaction.html#addTo">addTo</a>( optionsMenu );
|
|
|
|
<a href="ntqmainwindow.html#menuBar">menuBar</a>()->insertSeparator();
|
|
|
|
<a href="ntqpopupmenu.html">TQPopupMenu</a> *helpMenu = new <a href="ntqpopupmenu.html">TQPopupMenu</a>( this );
|
|
<a href="ntqmainwindow.html#menuBar">menuBar</a>()->insertItem( "&Help", helpMenu );
|
|
helpMenu-><a href="ntqmenudata.html#insertItem">insertItem</a>( "&Help", this, TQ_SLOT(helpHelp()), Key_F1 );
|
|
helpMenu-><a href="ntqmenudata.html#insertItem">insertItem</a>( "&About", this, TQ_SLOT(helpAbout()) );
|
|
helpMenu-><a href="ntqmenudata.html#insertItem">insertItem</a>( "About &TQt", this, TQ_SLOT(helpAboutTQt()) );
|
|
|
|
|
|
m_printer = 0;
|
|
m_elements.resize( MAX_ELEMENTS );
|
|
|
|
<a href="ntqsettings.html">TQSettings</a> settings;
|
|
<a name="x2890"></a> settings.<a href="ntqsettings.html#insertSearchPath">insertSearchPath</a>( TQSettings::Windows, WINDOWS_REGISTRY );
|
|
int windowWidth = settings.<a href="ntqsettings.html#readNumEntry">readNumEntry</a>( APP_KEY + "WindowWidth", 460 );
|
|
int windowHeight = settings.<a href="ntqsettings.html#readNumEntry">readNumEntry</a>( APP_KEY + "WindowHeight", 530 );
|
|
int windowX = settings.<a href="ntqsettings.html#readNumEntry">readNumEntry</a>( APP_KEY + "WindowX", -1 );
|
|
int windowY = settings.<a href="ntqsettings.html#readNumEntry">readNumEntry</a>( APP_KEY + "WindowY", -1 );
|
|
setChartType( ChartType(
|
|
settings.<a href="ntqsettings.html#readNumEntry">readNumEntry</a>( APP_KEY + "ChartType", int(PIE) ) ) );
|
|
m_addValues = AddValuesType(
|
|
settings.<a href="ntqsettings.html#readNumEntry">readNumEntry</a>( APP_KEY + "AddValues", int(NO) ));
|
|
m_decimalPlaces = settings.<a href="ntqsettings.html#readNumEntry">readNumEntry</a>( APP_KEY + "Decimals", 2 );
|
|
m_font = TQFont( "Helvetica", 18, TQFont::Bold );
|
|
m_font.fromString(
|
|
settings.<a href="ntqsettings.html#readEntry">readEntry</a>( APP_KEY + "Font", m_font.toString() ) );
|
|
for ( int i = 0; i < MAX_RECENTFILES; ++i ) {
|
|
<a href="ntqstring.html">TQString</a> filename = settings.<a href="ntqsettings.html#readEntry">readEntry</a>( APP_KEY + "File" +
|
|
<a name="x2893"></a> TQString::<a href="ntqstring.html#number">number</a>( i + 1 ) );
|
|
<a name="x2892"></a> if ( !filename.<a href="ntqstring.html#isEmpty">isEmpty</a>() )
|
|
m_recentFiles.push_back( filename );
|
|
}
|
|
if ( m_recentFiles.count() )
|
|
updateRecentFilesMenu();
|
|
|
|
|
|
// Connect *after* we've set the chart type on so we don't call
|
|
// drawElements() prematurely.
|
|
<a name="x2873"></a> <a href="ntqobject.html#connect">connect</a>( chartGroup, TQ_SIGNAL( <a href="qactiongroup.html#selected">selected</a>(TQAction*) ),
|
|
this, TQ_SLOT( updateChartType(TQAction*) ) );
|
|
|
|
<a href="ntqwidget.html#resize">resize</a>( windowWidth, windowHeight );
|
|
if ( windowX != -1 || windowY != -1 )
|
|
<a href="ntqwidget.html#move">move</a>( windowX, windowY );
|
|
|
|
m_canvas = new <a href="ntqcanvas.html">TQCanvas</a>( this );
|
|
<a name="x2876"></a> m_canvas-><a href="ntqcanvas.html#resize">resize</a>( <a href="ntqwidget.html#width">width</a>(), height() );
|
|
m_canvasView = new CanvasView( m_canvas, &m_elements, this );
|
|
<a href="ntqmainwindow.html#setCentralWidget">setCentralWidget</a>( m_canvasView );
|
|
m_canvasView-><a href="ntqwidget.html#show">show</a>();
|
|
|
|
if ( !filename.<a href="ntqstring.html#isEmpty">isEmpty</a>() )
|
|
load( filename );
|
|
else {
|
|
init();
|
|
m_elements[0].set( 20, red, 14, "Red" );
|
|
m_elements[1].set( 70, cyan, 2, "Cyan", darkGreen );
|
|
m_elements[2].set( 35, blue, 11, "Blue" );
|
|
m_elements[3].set( 55, yellow, 1, "Yellow", darkBlue );
|
|
m_elements[4].set( 80, magenta, 1, "Magenta" );
|
|
drawElements();
|
|
}
|
|
|
|
<a href="ntqmainwindow.html#statusBar">statusBar</a>()->message( "Ready", 2000 );
|
|
}
|
|
|
|
|
|
ChartForm::~ChartForm()
|
|
{
|
|
delete m_printer;
|
|
}
|
|
|
|
|
|
void <a name="f597"></a>ChartForm::init()
|
|
{
|
|
<a href="ntqwidget.html#setCaption">setCaption</a>( "Chart" );
|
|
m_filename = TQString::null;
|
|
m_changed = FALSE;
|
|
|
|
m_elements[0] = Element( Element::INVALID, red );
|
|
m_elements[1] = Element( Element::INVALID, cyan );
|
|
m_elements[2] = Element( Element::INVALID, blue );
|
|
m_elements[3] = Element( Element::INVALID, yellow );
|
|
m_elements[4] = Element( Element::INVALID, green );
|
|
m_elements[5] = Element( Element::INVALID, magenta );
|
|
m_elements[6] = Element( Element::INVALID, darkYellow );
|
|
m_elements[7] = Element( Element::INVALID, darkRed );
|
|
m_elements[8] = Element( Element::INVALID, darkCyan );
|
|
m_elements[9] = Element( Element::INVALID, darkGreen );
|
|
m_elements[10] = Element( Element::INVALID, darkMagenta );
|
|
m_elements[11] = Element( Element::INVALID, darkBlue );
|
|
for ( int i = 12; i < MAX_ELEMENTS; ++i ) {
|
|
double x = (double(i) / MAX_ELEMENTS) * 360;
|
|
int y = (int(x * 256) % 105) + 151;
|
|
int z = ((i * 17) % 105) + 151;
|
|
m_elements[i] = Element( Element::INVALID, TQColor( int(x), y, z, TQColor::Hsv ) );
|
|
}
|
|
}
|
|
|
|
<a name="x2896"></a>void ChartForm::<a href="ntqwidget.html#closeEvent">closeEvent</a>( <a href="qcloseevent.html">TQCloseEvent</a> * )
|
|
{
|
|
fileQuit();
|
|
}
|
|
|
|
|
|
void <a name="f598"></a>ChartForm::fileNew()
|
|
{
|
|
if ( okToClear() ) {
|
|
init();
|
|
drawElements();
|
|
}
|
|
}
|
|
|
|
|
|
void <a name="f599"></a>ChartForm::fileOpen()
|
|
{
|
|
if ( !okToClear() )
|
|
return;
|
|
|
|
<a href="ntqstring.html">TQString</a> filename = TQFileDialog::<a href="ntqfiledialog.html#getOpenFileName">getOpenFileName</a>(
|
|
TQString::null, "Charts (*.cht)", this,
|
|
"file open", "Chart -- File Open" );
|
|
if ( !filename.<a href="ntqstring.html#isEmpty">isEmpty</a>() )
|
|
load( filename );
|
|
else
|
|
<a href="ntqmainwindow.html#statusBar">statusBar</a>()->message( "File Open abandoned", 2000 );
|
|
}
|
|
|
|
|
|
void <a name="f600"></a>ChartForm::fileSaveAs()
|
|
{
|
|
<a href="ntqstring.html">TQString</a> filename = TQFileDialog::<a href="ntqfiledialog.html#getSaveFileName">getSaveFileName</a>(
|
|
TQString::null, "Charts (*.cht)", this,
|
|
"file save as", "Chart -- File Save As" );
|
|
if ( !filename.<a href="ntqstring.html#isEmpty">isEmpty</a>() ) {
|
|
int answer = 0;
|
|
<a name="x2878"></a> if ( TQFile::<a href="ntqfile.html#exists">exists</a>( filename ) )
|
|
<a name="x2889"></a> answer = TQMessageBox::<a href="ntqmessagebox.html#warning">warning</a>(
|
|
this, "Chart -- Overwrite File",
|
|
TQString( "Overwrite\n\'%1\'?" ).
|
|
arg( filename ),
|
|
"&Yes", "&No", TQString::null, 1, 1 );
|
|
if ( answer == 0 ) {
|
|
m_filename = filename;
|
|
updateRecentFiles( filename );
|
|
fileSave();
|
|
return;
|
|
}
|
|
}
|
|
<a href="ntqmainwindow.html#statusBar">statusBar</a>()->message( "Saving abandoned", 2000 );
|
|
}
|
|
|
|
|
|
void <a name="f601"></a>ChartForm::fileOpenRecent( int index )
|
|
{
|
|
if ( !okToClear() )
|
|
return;
|
|
|
|
load( m_recentFiles[index] );
|
|
}
|
|
|
|
|
|
void <a name="f602"></a>ChartForm::updateRecentFiles( const <a href="ntqstring.html">TQString</a>& filename )
|
|
{
|
|
if ( m_recentFiles.find( filename ) != m_recentFiles.end() )
|
|
return;
|
|
|
|
m_recentFiles.push_back( filename );
|
|
if ( m_recentFiles.count() > MAX_RECENTFILES )
|
|
m_recentFiles.pop_front();
|
|
|
|
updateRecentFilesMenu();
|
|
}
|
|
|
|
|
|
void <a name="f603"></a>ChartForm::updateRecentFilesMenu()
|
|
{
|
|
for ( int i = 0; i < MAX_RECENTFILES; ++i ) {
|
|
<a name="x2882"></a> if ( fileMenu-><a href="ntqmenudata.html#findItem">findItem</a>( i ) )
|
|
<a name="x2885"></a> fileMenu-><a href="ntqmenudata.html#removeItem">removeItem</a>( i );
|
|
if ( i < int(m_recentFiles.count()) )
|
|
fileMenu-><a href="ntqmenudata.html#insertItem">insertItem</a>( TQString( "&%1 %2" ).
|
|
arg( i + 1 ).arg( m_recentFiles[i] ),
|
|
this, TQ_SLOT( fileOpenRecent(int) ),
|
|
0, i );
|
|
}
|
|
}
|
|
|
|
|
|
void <a name="f604"></a>ChartForm::fileQuit()
|
|
{
|
|
if ( okToClear() ) {
|
|
saveOptions();
|
|
<a name="x2875"></a> tqApp-><a href="ntqapplication.html#exit">exit</a>( 0 );
|
|
}
|
|
}
|
|
|
|
|
|
bool <a name="f605"></a>ChartForm::okToClear()
|
|
{
|
|
if ( m_changed ) {
|
|
<a href="ntqstring.html">TQString</a> msg;
|
|
if ( m_filename.isEmpty() )
|
|
msg = "Unnamed chart ";
|
|
else
|
|
msg = TQString( "Chart '%1'\n" ).arg( m_filename );
|
|
msg += "has been changed.";
|
|
|
|
int x = TQMessageBox::<a href="ntqmessagebox.html#information">information</a>( this, "Chart -- Unsaved Changes",
|
|
msg, "&Save", "Cancel", "&Abandon",
|
|
0, 1 );
|
|
switch( x ) {
|
|
case 0: // Save
|
|
fileSave();
|
|
break;
|
|
case 1: // Cancel
|
|
default:
|
|
return FALSE;
|
|
case 2: // Abandon
|
|
break;
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
void <a name="f606"></a>ChartForm::saveOptions()
|
|
{
|
|
<a href="ntqsettings.html">TQSettings</a> settings;
|
|
settings.<a href="ntqsettings.html#insertSearchPath">insertSearchPath</a>( TQSettings::Windows, WINDOWS_REGISTRY );
|
|
<a name="x2891"></a> settings.<a href="ntqsettings.html#writeEntry">writeEntry</a>( APP_KEY + "WindowWidth", width() );
|
|
settings.<a href="ntqsettings.html#writeEntry">writeEntry</a>( APP_KEY + "WindowHeight", height() );
|
|
settings.<a href="ntqsettings.html#writeEntry">writeEntry</a>( APP_KEY + "WindowX", x() );
|
|
settings.<a href="ntqsettings.html#writeEntry">writeEntry</a>( APP_KEY + "WindowY", y() );
|
|
settings.<a href="ntqsettings.html#writeEntry">writeEntry</a>( APP_KEY + "ChartType", int(m_chartType) );
|
|
settings.<a href="ntqsettings.html#writeEntry">writeEntry</a>( APP_KEY + "AddValues", int(m_addValues) );
|
|
settings.<a href="ntqsettings.html#writeEntry">writeEntry</a>( APP_KEY + "Decimals", m_decimalPlaces );
|
|
settings.<a href="ntqsettings.html#writeEntry">writeEntry</a>( APP_KEY + "Font", m_font.toString() );
|
|
for ( int i = 0; i < int(m_recentFiles.count()); ++i )
|
|
settings.<a href="ntqsettings.html#writeEntry">writeEntry</a>( APP_KEY + "File" + TQString::number( i + 1 ),
|
|
m_recentFiles[i] );
|
|
}
|
|
|
|
|
|
void <a name="f607"></a>ChartForm::optionsSetData()
|
|
{
|
|
SetDataForm *setDataForm = new SetDataForm( &m_elements, m_decimalPlaces, this );
|
|
<a name="x2877"></a> if ( setDataForm-><a href="ntqdialog.html#exec">exec</a>() ) {
|
|
m_changed = TRUE;
|
|
drawElements();
|
|
}
|
|
delete setDataForm;
|
|
}
|
|
|
|
|
|
void <a name="f608"></a>ChartForm::setChartType( ChartType chartType )
|
|
{
|
|
m_chartType = chartType;
|
|
switch ( m_chartType ) {
|
|
case PIE:
|
|
<a name="x2871"></a> optionsPieChartAction-><a href="ntqaction.html#setOn">setOn</a>( TRUE );
|
|
break;
|
|
case VERTICAL_BAR:
|
|
optionsVerticalBarChartAction-><a href="ntqaction.html#setOn">setOn</a>( TRUE );
|
|
break;
|
|
case HORIZONTAL_BAR:
|
|
optionsHorizontalBarChartAction-><a href="ntqaction.html#setOn">setOn</a>( TRUE );
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
void <a name="f609"></a>ChartForm::updateChartType( <a href="ntqaction.html">TQAction</a> *action )
|
|
{
|
|
if ( action == optionsPieChartAction ) {
|
|
m_chartType = PIE;
|
|
}
|
|
else if ( action == optionsHorizontalBarChartAction ) {
|
|
m_chartType = HORIZONTAL_BAR;
|
|
}
|
|
else if ( action == optionsVerticalBarChartAction ) {
|
|
m_chartType = VERTICAL_BAR;
|
|
}
|
|
|
|
drawElements();
|
|
}
|
|
|
|
|
|
void <a name="f610"></a>ChartForm::optionsSetFont()
|
|
{
|
|
bool ok;
|
|
<a name="x2881"></a> <a href="ntqfont.html">TQFont</a> font = TQFontDialog::<a href="ntqfontdialog.html#getFont">getFont</a>( &ok, m_font, this );
|
|
if ( ok ) {
|
|
m_font = font;
|
|
drawElements();
|
|
}
|
|
}
|
|
|
|
|
|
void <a name="f611"></a>ChartForm::optionsSetOptions()
|
|
{
|
|
OptionsForm *optionsForm = new OptionsForm( this );
|
|
optionsForm->chartTypeComboBox->setCurrentItem( m_chartType );
|
|
optionsForm-><a href="ntqwidget.html#setFont">setFont</a>( m_font );
|
|
switch ( m_addValues ) {
|
|
case NO:
|
|
optionsForm->noRadioButton->setChecked( TRUE );
|
|
break;
|
|
case YES:
|
|
optionsForm->yesRadioButton->setChecked( TRUE );
|
|
break;
|
|
case AS_PERCENTAGE:
|
|
optionsForm->asPercentageRadioButton->setChecked( TRUE );
|
|
break;
|
|
}
|
|
optionsForm->decimalPlacesSpinBox->setValue( m_decimalPlaces );
|
|
if ( optionsForm-><a href="ntqdialog.html#exec">exec</a>() ) {
|
|
setChartType( ChartType(
|
|
optionsForm->chartTypeComboBox->currentItem()) );
|
|
<a name="x2897"></a> m_font = optionsForm-><a href="ntqwidget.html#font">font</a>();
|
|
if ( optionsForm->noRadioButton->isChecked() )
|
|
m_addValues = NO;
|
|
else if ( optionsForm->yesRadioButton->isChecked() )
|
|
m_addValues = YES;
|
|
else if ( optionsForm->asPercentageRadioButton->isChecked() )
|
|
m_addValues = AS_PERCENTAGE;
|
|
m_decimalPlaces = optionsForm->decimalPlacesSpinBox->value();
|
|
drawElements();
|
|
}
|
|
delete optionsForm;
|
|
}
|
|
|
|
|
|
void <a name="f612"></a>ChartForm::helpHelp()
|
|
{
|
|
<a href="ntqmainwindow.html#statusBar">statusBar</a>()->message( "Help is not implemented yet", 2000 );
|
|
}
|
|
|
|
|
|
void <a name="f613"></a>ChartForm::helpAbout()
|
|
{
|
|
<a name="x2886"></a> TQMessageBox::<a href="ntqmessagebox.html#about">about</a>( this, "Chart -- About",
|
|
"<center><h1><font color=blue>Chart<font></h1></center>"
|
|
"<p>Chart your data with <i>chart</i>.</p>"
|
|
);
|
|
}
|
|
|
|
|
|
void <a name="f614"></a>ChartForm::helpAboutTQt()
|
|
{
|
|
<a name="x2887"></a> TQMessageBox::<a href="ntqmessagebox.html#aboutTQt">aboutTQt</a>( this, "Chart -- About TQt" );
|
|
}
|
|
|
|
</pre>
|
|
|
|
<p> <hr>
|
|
<p> Main:
|
|
<p> <pre>#include <<a href="qapplication-h.html">ntqapplication.h</a>>
|
|
#include "chartform.h"
|
|
|
|
|
|
int main( int argc, char *argv[] )
|
|
{
|
|
<a href="ntqapplication.html">TQApplication</a> app( argc, argv );
|
|
|
|
<a href="ntqstring.html">TQString</a> filename;
|
|
<a name="x2900"></a> if ( app.<a href="ntqapplication.html#argc">argc</a>() > 1 ) {
|
|
<a name="x2901"></a> filename = app.<a href="ntqapplication.html#argv">argv</a>()[1];
|
|
<a name="x2904"></a> if ( !filename.<a href="ntqstring.html#endsWith">endsWith</a>( ".cht" ) )
|
|
filename = TQString::null;
|
|
}
|
|
|
|
ChartForm *cf = new ChartForm( filename );
|
|
app.<a href="ntqapplication.html#setMainWidget">setMainWidget</a>( cf );
|
|
cf-><a href="ntqwidget.html#show">show</a>();
|
|
|
|
return app.<a href="ntqapplication.html#exec">exec</a>();
|
|
}
|
|
</pre>
|
|
|
|
<p> <p>See also <a href="step-by-step-examples.html">Step-by-step Examples</a>.
|
|
|
|
<!-- eof -->
|
|
<p><address><hr><div align=center>
|
|
<table width=100% cellspacing=0 border=0><tr>
|
|
<td>Copyright © 2007
|
|
<a href="troll.html">Trolltech</a><td align=center><a href="trademarks.html">Trademarks</a>
|
|
<td align=right><div align=right>TQt 3.3.8</div>
|
|
</table></div></address></body>
|
|
</html>
|