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(&amp;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-&gt;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-&gt;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>&lt;Datum&gt;&amp; graphData();    ColType colType(int col) const;    int nCols() const;    void consumeLine();    <a href="qptrlist.html">QPtrList</a>&lt;Datum&gt; 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&lt;GraphModel::Datum&gt;&amp; <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-&gt;<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-&gt;<a href="qwidget.html#font">font</a>().pointSize();    if (fontfamily) graph-&gt;<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( &amp;line );    if (firstline) {        firstline = FALSE;        ncols=0;        <a href="qptrlist.html">QPtrList</a>&lt;ColType&gt; typelist;        typelist.<a href="qptrcollection.html#setAutoDelete">setAutoDelete</a>(TRUE);        do {            <a href="qstring.html">QString</a> typestr;            ts &gt;&gt; typestr &gt;&gt; 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 &lt; ncols &amp;&amp; !ts.<a href="qtextstream.html#atEnd">atEnd</a>() ) {            switch (coltype[col]) {              case Numeric: {                double value;                ts &gt;&gt; value &gt;&gt; ws;                rowdata[col].dbl = value;                break;              }              case Label: {                <a href="qstring.html">QString</a>* value = new <a href="qstring.html">QString</a>;                ts &gt;&gt; *value &gt;&gt; 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&lt;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>()-&gt;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 &copy; 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 + -
显示快捷键?