⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tutorial2-05.html

📁 QT参考文档
💻 HTML
📖 第 1 页 / 共 2 页
字号:
<a name="2-1"></a><p> <pre>    void ChartForm::init()
    {
        <a href="qwidget.html#setCaption">setCaption</a>( "Chart" );
        m_filename = <a href="qstring.html#QString-null">QString::null</a>;
        m_changed = false;

        m_elements[0]  = Element( Element::INVALID, red );
        m_elements[1]  = Element( Element::INVALID, cyan );
        m_elements[2]  = Element( Element::INVALID, blue );
</pre><tt>...</tt>
<p> 我们使用了init()函数是因为我们想在视窗被构造的时候和无论用户载入一个存在的数据组或者创建一个新的数据组的时候初始化画布和元素(在<tt>m_elements</tt> <tt>ElementVector</tt>中)。
<p> 我们重新设置标题并设置当前文件名称为QString::null。我们也用无效的元素来组装元素矢量。这不是必需的,但是给每一个元素一个不同的颜色对于用户来讲是更方便的,因为当他们输入值的时候每一个都会已经有了一个确定的颜色(当然他们可以修改)。
<p> <h2> 文件处理动作
</h2>
<a name="3"></a><p> <h3> okToClear()
</h3>
<a name="3-1"></a><p> <pre>    bool ChartForm::okToClear()
    {
        if ( m_changed ) {
            <a href="qstring.html">QString</a> msg;
            if ( m_filename.isEmpty() )
                msg = "Unnamed chart ";
            else
                msg = QString( "Chart '%1'\n" ).arg( m_filename );
            msg += "has been changed.";
            switch( QMessageBox::<a href="qmessagebox.html#information">information</a>( this, "Chart -- Unsaved Changes",
                                              msg, "&amp;Save", "Cancel", "&amp;Abandon",
                                              0, 1 ) ) {
                case 0:
                    fileSave();
                    break;
                case 1:
                default:
                    return false;
                    break;
                case 2:
                    break;
            }
        }

        return true;
    }
</pre>
<p> okToClear()函数用来提示用户在有没保存的数据的时候保存它们。它也被其它几个函数使用。
<p> <h3> fileNew()
</h3>
<a name="3-2"></a><p> 

<pre>    void ChartForm::fileNew()
    {
        if ( okToClear() ) {
            init();
            drawElements();
        }
    }
</pre>
<p> 当用户调用fileNew()动作时,我们调用okToClear()来给他们一个保存任何为保存的数据的机会。无论他们保存或者放弃或者没有任何为保存的数据,我们都重新初始化元素矢量并绘制默认图表。
<p> <center><table cellpadding="4" cellspacing="2" border="0">
<tr bgcolor="#d0d0d0">
<td valign="top">我们是不是也应该调用optionsSetData()来弹出一个对话框,让用户通过它来创建和编辑值、颜色等等呢?你可以运行一下现在的应用程序,然后试着把optionsSetData()的调用添加进去后再运行并观察它们来决定你更喜欢哪一个。
</table></center>
<p> <h3> fileOpen()
</h3>
<a name="3-3"></a><p> <pre>    void ChartForm::fileOpen()
    {
        if ( !okToClear() )
            return;

    <a name="x2414"></a>    <a href="qstring.html">QString</a> filename = QFileDialog::<a href="qfiledialog.html#getOpenFileName">getOpenFileName</a>(
                                QString::null, "Charts (*.cht)", this,
                                "file open", "Chart -- File Open" );
    <a name="x2417"></a>    if ( !filename.<a href="qstring.html#isEmpty">isEmpty</a>() )
            load( filename );
        else
            <a href="qmainwindow.html#statusBar">statusBar</a>()-&gt;message( "File Open abandoned", 2000 );
    }
</pre>
<p> 我们检查它是否是okToClear()。如果是的话,我们使用静态的<a href="qfiledialog.html#getOpenFileName">QFileDialog::getOpenFileName</a>()函数来获得用户想要载入的文件的名称。如果我们得到一个文件名,我们就调用load()。
<p> <h3> fileSaveAs()
</h3>
<a name="3-4"></a><p> <pre>    void ChartForm::fileSaveAs()
    {
    <a name="x2415"></a>    <a href="qstring.html">QString</a> filename = QFileDialog::<a href="qfiledialog.html#getSaveFileName">getSaveFileName</a>(
                                QString::null, "Charts (*.cht)", this,
                                "file save as", "Chart -- File Save As" );
        if ( !filename.<a href="qstring.html#isEmpty">isEmpty</a>() ) {
            int answer = 0;
    <a name="x2413"></a>        if ( QFile::<a href="qfile.html#exists">exists</a>( filename ) )
    <a name="x2416"></a>            answer = QMessageBox::<a href="qmessagebox.html#warning">warning</a>(
                                this, "Chart -- Overwrite File",
                                QString( "Overwrite\n\'%1\'?" ).
                                    arg( filename ),
                                "&amp;Yes", "&amp;No", QString::null, 1, 1 );
            if ( answer == 0 ) {
                m_filename = filename;
                updateRecentFiles( filename );
                fileSave();
                return;
            }
        }
        <a href="qmainwindow.html#statusBar">statusBar</a>()-&gt;message( "Saving abandoned", 2000 );
    }
</pre>
<p> 这个函数调用了静态的<a href="qfiledialog.html#getSaveFileName">QFileDialog::getSaveFileName</a>()来得到一个要保存数据的文件的明处那个。如果文件存在,我们使用使用一个<a href="qmessagebox.html#warning">QMessageBox::warning</a>()来提醒用户并给他们一个放弃保存的选择。如果文件被保存了我们就更新最近打开的文件列表并调用fileSave()(在<a href="tutorial2-07.html">文件处理</a>中)来执行存储。
<p> <h2> 管理最近打开文件的列表
</h2>
<a name="4"></a><p> 

<pre>        <a href="qstringlist.html">QStringList</a> m_recentFiles;
</pre>
<p> 我们用一个字符串列表来处理这个最近打开文件的列表。
<p> 

<pre>    void ChartForm::updateRecentFilesMenu()
    {
        for ( int i = 0; i &lt; MAX_RECENTFILES; ++i ) {
            if ( fileMenu-&gt;<a href="qmenudata.html#findItem">findItem</a>( i ) )
                fileMenu-&gt;<a href="qmenudata.html#removeItem">removeItem</a>( i );
            if ( i &lt; int(m_recentFiles.count()) )
                fileMenu-&gt;<a href="qmenudata.html#insertItem">insertItem</a>( QString( "&amp;%1 %2" ).
                                        arg( i + 1 ).arg( m_recentFiles[i] ),
                                      this, SLOT( fileOpenRecent(int) ),
                                      0, i );
        }
    }
</pre>
<p> 无论用户打开一个存在的文件或者保存一个新文件的时候,这个函数会被调用(通常是通过updateRecentFiles())。对于这个字符串列表中的每一个文件我们都插入一个新的菜单条目。我们在每一个文件名的前面都加上一个从<u>1</u>到<u>9</u>带下划线的数字,这样就可以支持键盘操作(比如,<tt>Alt+F,2</tt>就可以打开列表中的第二个文件)。我们给每一个菜单条目一个和它们在字符串列表中的索引位置相同的数值作为id,并且把每一个菜单条目都和fileOpenRecent()槽相连。老的文件菜单条目会在每一个最新的文件菜单条目id来到的同时被删除。它会工作是因为其它文件菜单条目都有一个由Qt生成的id(它们都是&lt;0的),然而我们所创建的菜单条目的id都是&gt;=0的。
<p> 

<pre>    void ChartForm::updateRecentFiles( const <a href="qstring.html">QString</a>&amp; filename )
    {
        if ( m_recentFiles.find( filename ) != m_recentFiles.end() )
            return;

        m_recentFiles.push_back( filename );
        if ( m_recentFiles.count() &gt; MAX_RECENTFILES )
            m_recentFiles.pop_front();

        updateRecentFilesMenu();
    }
</pre>
<p> 当用户打开一个存在的文件或者保存一个新文件的时候,它会被调用。如果文件已经存在于列表中,它就会很简单地返回。否则这个文件会被添加到列表的末尾并且如果列表太大(&gt;9个文件)的话,第一个(最老的)就会被移去。然后updateRecentFilesMenu()被调用来在File菜单中重新创建最近使用的文件列表。
<p> 

<pre>    void ChartForm::fileOpenRecent( int index )
    {
        if ( !okToClear() )
            return;

        load( m_recentFiles[index] );
    }
</pre>
<p> 当用户选择了一个最近打开的文件时,fileOpenRecent()槽会伴随一个用户选择的文件的菜单id而被调用。因为我们使文件菜单的id和文件在<tt>m_recentFiles</tt>列表中的索引位置相等,我们就可以很简单的通过文件的菜单条目id来载入了。
<p> <h2> 退出
</h2>
<a name="5"></a><p> <pre>    void ChartForm::fileQuit()
    {
        if ( okToClear() ) {
            saveOptions();
            qApp-&gt;<a href="qapplication.html#exit">exit</a>( 0 );
        }
    }
</pre>
<p> 当用户退出时,我们给他们保存任何未保存数据的机会(okToClear()),然后在结束之前保存它们的选项,比如窗口的大小和位置、图表类型等等。
<p> <pre>    void ChartForm::saveOptions()
    {
        <a href="qsettings.html">QSettings</a> settings;
        settings.<a href="qsettings.html#insertSearchPath">insertSearchPath</a>( QSettings::Windows, WINDOWS_REGISTRY );
        settings.<a href="qsettings.html#writeEntry">writeEntry</a>( APP_KEY + "WindowWidth", width() );
        settings.<a href="qsettings.html#writeEntry">writeEntry</a>( APP_KEY + "WindowHeight", height() );
        settings.<a href="qsettings.html#writeEntry">writeEntry</a>( APP_KEY + "WindowX", x() );
        settings.<a href="qsettings.html#writeEntry">writeEntry</a>( APP_KEY + "WindowY", y() );
        settings.<a href="qsettings.html#writeEntry">writeEntry</a>( APP_KEY + "ChartType", int(m_chartType) );
        settings.<a href="qsettings.html#writeEntry">writeEntry</a>( APP_KEY + "AddValues", int(m_addValues) );
        settings.<a href="qsettings.html#writeEntry">writeEntry</a>( APP_KEY + "Decimals", m_decimalPlaces );
        settings.<a href="qsettings.html#writeEntry">writeEntry</a>( APP_KEY + "Font", m_font.toString() );
        for ( int i = 0; i &lt; int(m_recentFiles.count()); ++i )
            settings.<a href="qsettings.html#writeEntry">writeEntry</a>( APP_KEY + "File" + QString::number( i + 1 ),
                                 m_recentFiles[i] );
    }
</pre>
<p> 直接使用<a href="qsettings.html">QSettings</a>来保存用户选项。
<p> <h2> 自定义对话框
</h2>
<a name="6"></a><p> 我们想让用户可以手工地设置一些选项并且创建和编辑值、值颜色等等。
<p> 

<pre>    void ChartForm::optionsSetOptions()
    {
        OptionsForm *optionsForm = new OptionsForm( this );
        optionsForm-&gt;chartTypeComboBox-&gt;setCurrentItem( m_chartType );
        optionsForm-&gt;<a href="qwidget.html#setFont">setFont</a>( m_font );
</pre><pre>        if ( optionsForm-&gt;<a href="qdialog.html#exec">exec</a>() ) {
            setChartType( ChartType(
                    optionsForm-&gt;chartTypeComboBox-&gt;currentItem()) );
            m_font = optionsForm-&gt;<a href="qwidget.html#font">font</a>();
</pre><pre>            drawElements();
        }
        delete optionsForm;
    }
</pre>
<p> 设置选项的视窗是由我们自定义的<tt>OptionsForm</tt>提供的,在<a href="tutorial2-09.html">设置选项</a>中。这个选项视窗是一个标准的“哑的”对话框:我们创建一个实例,把所有的图形用户界面元素都和所有相关的设置都组装起来,并且如果用户点击了“OK”(exec()返回一个真值)我们就会从图形用户界面元素中读取设置。
<pre>    void ChartForm::optionsSetData()
    {
        SetDataForm *setDataForm = new SetDataForm( &amp;m_elements, m_decimalPlaces, this );
        if ( setDataForm-&gt;<a href="qdialog.html#exec">exec</a>() ) {
            m_changed = true;
            drawElements();
        }
        delete setDataForm;
    }
</pre>
<p> 创建和编辑图表数据的视窗由我们自定义的<tt>SetDataForm</tt>提供,在<a href="tutorial2-08.html">获得数据</a>中。这个视窗是一个“聪明的”对话框。我们传入我们想要使用的数据结构,并且对话框可以自己处理数据机构的表达。如果用户点击“OK”,对话框会更新数据结构并且exec()会返回一个真值。如果用户改变了数据时我们在optionsSetData()中所要做的时把图表标记为changed并调用drawElements()来使用新的和更新过的数据来重新绘制图表。
<p> <p align=right>
<a href="tutorial2-04.html">&laquo; 主体很容易</a> |
<a href="tutorial2.html">目录</a> |
<a href="tutorial2-06.html">画布控制 &raquo;</a>
</p>
<p> 
<!-- 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><a href="zh_CN.html">译者:Cavendish</a>
<td align=right><div align=right>Qt 3.0.5版</div>
</table></div></address></body>
</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -