grapher-nsplugin-example.html
来自「QT 下载资料仅供参考」· HTML 代码 · 共 709 行 · 第 1/2 页
HTML
709 行
int apos = (pieRotation-90)*16; const int w = <a href="qwidget.html#width">width</a>(); const int h = <a href="qwidget.html#height">height</a>(); const int xd = w - w/5; const int yd = h - h/5;<a name="x2774"></a> pm.<a href="qpixmap.html#resize">resize</a>(<a href="qwidget.html#width">width</a>(),height());<a name="x2773"></a> pm.<a href="qpixmap.html#fill">fill</a>(<a href="qwidget.html#backgroundColor">backgroundColor</a>()); <a href="qpainter.html">QPainter</a> p(&pm);<a name="x2771"></a> p.<a href="qpainter.html#setFont">setFont</a>(<a href="qwidget.html#font">font</a>()); p.<a href="qpainter.html#setClipRect">setClipRect</a>(event->rect()); int i = 0; for (rowdata = data.<a href="qptrlist.html#first">first</a>(); rowdata; rowdata = data.<a href="qptrlist.html#next">next</a>()) { <a href="qcolor.html">QColor</a> c; c.<a href="qcolor.html#setHsv">setHsv</a>( ( i * 255)/data.<a href="qptrlist.html#count">count</a>(), 255, 255 );// rainbow effect p.<a href="qpainter.html#setBrush">setBrush</a>( c ); // solid fill with color c int a = int(( rowdata[0].dbl * 360.0 ) / total * 16.0 + 0.5);<a name="x2765"></a> p.<a href="qpainter.html#drawPie">drawPie</a>( w/10, h/10, xd, yd, -apos, -a ); apos += a; i++; } if (model.colType(1) == GraphModel::Label) { double apos = (pieRotation-90)*M_PI/180; for (rowdata = data.<a href="qptrlist.html#first">first</a>(); rowdata; rowdata = data.<a href="qptrlist.html#next">next</a>()) { double a = rowdata[0].dbl * 360 / total * M_PI / 180; int x = int(cos(apos+a/2)*w*5/16 + w/2 + 0.5); int y = int(sin(apos+a/2)*h*5/16 + h/2 + 0.5); // ### This causes a crash, so comment out for now /*p.<a href="qpainter.html#drawText">drawText</a>(x-w/8, y-h/8, w/4, h/4, WordBreak|AlignCenter, *rowdata[1].str);*/ apos += a; } } <a href="qpainter.html">QPainter</a> p2(this); p2.<a href="qpainter.html#setClipRect">setClipRect</a>(event->rect());<a name="x2766"></a> p2.<a href="qpainter.html#drawPixmap">drawPixmap</a>(0,0,pm);}void <a name="f632"></a>Graph::paintWait(QPaintEvent*){ <a href="qpainter.html">QPainter</a> p(this); p.<a href="qpainter.html#drawText">drawText</a>(rect(), AlignCenter, "Loading...");}void Graph::<a href="qwidget.html#paintEvent">paintEvent</a>(QPaintEvent* event){ if (!model.nCols()) { paintWait(event); } else { switch (style) { case Pie: paintPie(event); break; case Bar: paintBar(event); break; } }}void <a name="f633"></a>Graph::setStyleFromMenu(int id){ setStyle(Style(id-100));}const char* Graph::styleName[] = { "Pie", "Bar", 0 };//// Grapher is a subclass of QNPInstance, and so it can be returned// by GrapherPlugin::newInstance(). A QNPInstance represents the// plugin, distinctly from the plugin window.//// Grapher is also a GraphModel, because it loads graph data from// the net. When Grapher creates a window in newWindow(), it creates// a Graph widget to display the GraphModel that is the Grapher itself.//class Grapher : public <a href="qnpinstance.html">QNPInstance</a>, GraphModel { Q_OBJECTpublic: // Create a Grapher - all Grapher plugins are created // by one GrapherPlugin object. // Grapher(); ~Grapher(); // We override this QNPInstance function to create our // own subclass of QNPWidget, a Graph widget. // <a href="qnpwidget.html">QNPWidget</a>* newWindow(); // We override this QNPInstance function to process the // incoming graph data. // int write(QNPStream* /*str*/, int /*offset*/, int len, void* buffer);private: // Grapher is a GraphModel, so it implements the pure virtual // functions of that class. // <a href="qptrlist.html">QPtrList</a><Datum>& graphData(); ColType colType(int col) const; int nCols() const; void consumeLine(); <a href="qptrlist.html">QPtrList</a><Datum> data; <a href="qbuffer.html">QBuffer</a> line; bool firstline; int ncols; ColType *coltype;private slots: // Slots that are connected to the Graph menu items. // void aboutPlugin(); void aboutData();};<a name="f634"></a>Grapher::Grapher(){<a name="x2777"></a> data.<a href="qptrcollection.html#setAutoDelete">setAutoDelete</a>(TRUE); firstline = TRUE; ncols = 0;<a name="x2751"></a> line.<a href="qiodevice.html#open">open</a>(IO_WriteOnly|IO_Truncate);}Grapher::~Grapher(){}QPtrList<GraphModel::Datum>& <a name="f635"></a>Grapher::graphData(){ return data;}GraphModel::ColType <a name="f636"></a>Grapher::colType(int col) const{ return coltype[col];}int <a name="f637"></a>Grapher::nCols() const{ return ncols;}<a name="x2759"></a>QNPWidget* Grapher::<a href="qnpinstance.html#newWindow">newWindow</a>(){ // Create a Graph - our subclass of QNPWidget. Graph *graph = new Graph(*this); // Look at the arguments from the EMBED tag. // GRAPHSTYLE chooses pie or bar // FONTFAMILY and FONTSIZE choose the font // const char* style = <a href="qnpinstance.html#arg">arg</a>("GRAPHSTYLE"); if ( style ) graph-><a href="qwidget.html#setStyle">setStyle</a>(style); const char* fontfamily = <a href="qnpinstance.html#arg">arg</a>("FONTFAMILY"); const char* fontsize = <a href="qnpinstance.html#arg">arg</a>("FONTSIZE");<a name="x2783"></a> int ptsize = fontsize ? atoi(fontsize) : graph-><a href="qwidget.html#font">font</a>().pointSize(); if (fontfamily) graph-><a href="qwidget.html#setFont">setFont</a>(QFont(fontfamily, ptsize)); <a href="qobject.html#connect">connect</a>(graph, SIGNAL(aboutPlugin()), this, SLOT(aboutPlugin())); <a href="qobject.html#connect">connect</a>(graph, SIGNAL(aboutData()), this, SLOT(aboutData())); return graph;}void <a name="f638"></a>Grapher::consumeLine(){<a name="x2750"></a> line.<a href="qiodevice.html#close">close</a>(); line.<a href="qiodevice.html#open">open</a>(IO_ReadOnly); <a href="qtextstream.html">QTextStream</a> ts( &line ); if (firstline) { firstline = FALSE; ncols=0; <a href="qptrlist.html">QPtrList</a><ColType> typelist; typelist.<a href="qptrcollection.html#setAutoDelete">setAutoDelete</a>(TRUE); do { <a href="qstring.html">QString</a> typestr; ts >> typestr >> ws; ColType* t = 0; if ( typestr == "num" ) { t = new ColType(Numeric); } else if ( typestr == "label" ) { t = new ColType(Label); }<a name="x2778"></a> if (t) typelist.<a href="qptrlist.html#append">append</a>(t);<a name="x2782"></a> } while (!ts.<a href="qtextstream.html#atEnd">atEnd</a>()); coltype = new ColType[ncols]; for (ColType* t = typelist.<a href="qptrlist.html#first">first</a>(); t; t = typelist.<a href="qptrlist.html#next">next</a>()) { coltype[ncols++] = *t; } } else { int col=0; Datum *rowdata = new Datum[ncols]; while ( col < ncols && !ts.<a href="qtextstream.html#atEnd">atEnd</a>() ) { switch (coltype[col]) { case Numeric: { double value; ts >> value >> ws; rowdata[col].dbl = value; break; } case Label: { <a href="qstring.html">QString</a>* value = new <a href="qstring.html">QString</a>; ts >> *value >> ws; rowdata[col].str = value; break; } } col++; } data.<a href="qptrlist.html#append">append</a>(rowdata); } line.<a href="qiodevice.html#close">close</a>(); line.<a href="qiodevice.html#open">open</a>(IO_WriteOnly|IO_Truncate);}<a name="x2760"></a>int Grapher::<a href="qnpinstance.html#write">write</a>(QNPStream* /*str*/, int /*offset*/, int len, void* buffer){ // The browser calls this function when data is available on one // of the streams the plugin has requested. Since we are only // processing one stream - the URL in the SRC argument of the EMBED // tag, we assume the QNPStream is that one. Also, since we do not // override QNPInstance::writeReady(), we must accepts ALL the data // that is sent to this function. // char* txt = (char*)buffer; for (int i=0; i<len; i++) { char ch = txt[i]; switch ( ch ) { case '\n': consumeLine(); break; case '\r': // ignore; break; default:<a name="x2752"></a> line.<a href="qiodevice.html#putch">putch</a>(ch); } } if ( <a href="qnpinstance.html#widget">widget</a>() ) { <a href="qnpinstance.html#widget">widget</a>()->update(); } return len;}void <a name="f639"></a>Grapher::aboutPlugin(){ <a href="qnpinstance.html#getURL">getURL</a>( "http://www.trolltech.com/nsplugin/", "_blank" );}void <a name="f640"></a>Grapher::aboutData(){ const char* page = <a href="qnpinstance.html#arg">arg</a>("DATAPAGE"); if (page) <a href="qnpinstance.html#getURL">getURL</a>( page, "_blank" ); else<a name="x2758"></a> QMessageBox::<a href="qmessagebox.html#message">message</a>("Help", "No help for this data");}//// GrapherPlugin is the start of everything. It is a QNPlugin subclass,// and it is responsible for describing the plugin to the browser, and// creating instances of the plugin when it appears in web page.//class GrapherPlugin : public <a href="qnplugin.html">QNPlugin</a> {public: GrapherPlugin() { } <a href="qnpinstance.html">QNPInstance</a>* newInstance() { // Make a new Grapher, our subclass of QNPInstance. return new Grapher; } const char* getMIMEDescription() const { // Describe the MIME types which this plugin can // process. Just the concocted "application/x-graphable" // type, with the "g1n" filename extension. // return "application/x-graphable:g1n:Graphable ASCII numeric data"; } const char * getPluginNameString() const { // The name of the plugin. This is the title string used in // the "About Plugins" page of the browser. // return "Qt-based Graph Plugin"; } const char * getPluginDescriptionString() const { // A longer description of the plugin. // return "A Qt-based LiveConnected plug-in that graphs numeric data"; }};//// Finally, we provide the implementation of QNPlugin::create(), to// provide our subclass of QNPlugin.//QNPlugin* QNPlugin::create(){ return new GrapherPlugin;}#include "grapher.moc"</pre><p>See also <a href="nsplugin-examples.html">LiveConnect Examples</a>.<!-- eof --><p><address><hr><div align=center><table width=100% cellspacing=0 border=0><tr><td>Copyright © 2002 <a href="http://www.trolltech.com">Trolltech</a><td><a href="http://www.trolltech.com/trademarks.html">Trademarks</a><td align=right><div align=right>Qt version 3.0.5</div></table></div></address></body></html>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?