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

📄 sql.html

📁 这是qt3的帮助文档的中文版
💻 HTML
📖 第 1 页 / 共 5 页
字号:
        <a href="qlabel.html">QLabel</a> *forenameDisplay = new <a href="qlabel.html">QLabel</a>( this );
        <a href="qlabel.html">QLabel</a> *surnameLabel    = new <a href="qlabel.html">QLabel</a>( "Surname:", this );
        <a href="qlabel.html">QLabel</a> *surnameDisplay  = new <a href="qlabel.html">QLabel</a>( this );
        <a href="qlabel.html">QLabel</a> *salaryLabel     = new <a href="qlabel.html">QLabel</a>( "Salary:", this );
        <a href="qlineedit.html">QLineEdit</a> *salaryEdit   = new <a href="qlineedit.html">QLineEdit</a>( this );

        <a href="qgridlayout.html">QGridLayout</a> *grid = new <a href="qgridlayout.html">QGridLayout</a>( this );
    <a name="x2220"></a>    grid-&gt;<a href="qgridlayout.html#addWidget">addWidget</a>( forenameLabel,     0, 0 );
        grid-&gt;<a href="qgridlayout.html#addWidget">addWidget</a>( forenameDisplay,   0, 1 );
        grid-&gt;<a href="qgridlayout.html#addWidget">addWidget</a>( surnameLabel,      1, 0 );
        grid-&gt;<a href="qgridlayout.html#addWidget">addWidget</a>( surnameDisplay,    1, 1 );
        grid-&gt;<a href="qgridlayout.html#addWidget">addWidget</a>( salaryLabel,       2, 0 );
        grid-&gt;<a href="qgridlayout.html#addWidget">addWidget</a>( salaryEdit,        2, 1 );
    <a name="x2221"></a>    grid-&gt;<a href="qlayout.html#activate">activate</a>();

        <a href="qsqlcursor.html">QSqlCursor</a> staffCursor( "staff" );
        staffCursor.<a href="qsqlcursor.html#select">select</a>();
        staffCursor.<a href="qsqlquery.html#next">next</a>();

        <a href="qsqlform.html">QSqlForm</a> sqlForm( this );
    <a name="x2226"></a><a name="x2222"></a>    sqlForm.<a href="qsqlform.html#setRecord">setRecord</a>( staffCursor.<a href="qsqlcursor.html#primeUpdate">primeUpdate</a>() );
    <a name="x2224"></a>    sqlForm.<a href="qsqlform.html#insert">insert</a>( forenameDisplay, "forename" );
        sqlForm.<a href="qsqlform.html#insert">insert</a>( surnameDisplay, "surname" );
        sqlForm.<a href="qsqlform.html#insert">insert</a>( salaryEdit, "salary" );
    <a name="x2225"></a>    sqlForm.<a href="qsqlform.html#readFields">readFields</a>();
    }

    int main( int argc, char *argv[] )
    {
        <a href="qapplication.html">QApplication</a> app( argc, argv );

        if ( ! createConnections() ) return 1;

        FormDialog *formDialog = new FormDialog();
    <a name="x2219"></a>    formDialog-&gt;<a href="qdialog.html#show">show</a>();
        app.<a href="qapplication.html#setMainWidget">setMainWidget</a>( formDialog );

        return app.<a href="qapplication.html#exec">exec</a>();
    }
</pre><blockquote><p align="center"><em> 来自<a href="sql-overview-form1-main-cpp.html">sql/overview/form1/main.cpp</a>
</em></p>
</blockquote><p> 我们需要引用各组件所需要的头文件,我们还加入<a href="qsqldatabase-h.html">qsqldatabase.h</a>和<a href="qsqlcursor-h.html">qsqlcursor.h</a>,同时还有<a href="qsqlform-h.html">qsqlform.h</a>。
<p> 本窗体是以对话框形式出现的,窗体类FormDialog继承于<a href="qdialog.html">QDialog</a>。我们使用了一个<a href="qlineedit.html">QLineEdit</a>来显示薪水同时也允许用户对其进行修改。所有的组件显示在一个网格中。
<p> 我们为staff表创建了一个游标。让它从数据库取出所有的记录并定位至第一条记录。
<p> 现在我们创建了一个<a href="qsqlform.html">QSqlForm</a>对象并把<a href="qsqlform.html">QSqlForm</a>的记录缓冲区与游标的更新缓冲区对应起来。对于每个我们希望其数据感知的组件都把与相应的字段名结合进<a href="qsqlform.html">QSqlForm</a>,最后我们调用readFields()把游标缓冲区中的数据刷新至关联窗口部件。
<p> <a name="Displaying_a_Record_in_a_DataForm"></a>
<h4> 在数据窗体中显示记录
</h4>
<a name="8-2-2"></a><p> <a href="qdataview.html">QDataView</a>是一个可以拥有只读<a href="qsqlform.html">QSqlForm</a>。与<a href="qsqlform.html">QSqlForm</a>类似它也提供了一个槽refresh( <a href="qsqlrecord.html">QSqlRecord</a> * ),因此它可以比较容易地与<a href="qdatatable.html">QDataTable</a>连接在一起用来显示数据:
<p> <pre>
    connect( myDataTable, SIGNAL( currentChanged( <a href="qsqlrecord.html">QSqlRecord</a>* ) ), 
             myDataView, SLOT( refresh( <a href="qsqlrecord.html">QSqlRecord</a>* ) ) );
</pre>
 
<p> <a name="Editing_a_Record"></a>
<h4> 编辑记录
</h4>
<a name="8-2-3"></a><p> 这个实例与上述的比较相似,所以我们讨论不同部分。
<p> 

<pre>    class FormDialog : public <a href="qdialog.html">QDialog</a>
    {
        <a href="metaobjects.html#Q_OBJECT">Q_OBJECT</a>
        public:
            FormDialog();
            ~FormDialog();
        public slots:
            void save();
        private:
            <a href="qsqlcursor.html">QSqlCursor</a> staffCursor;
            <a href="qsqlform.html">QSqlForm</a> *sqlForm;
            <a href="qsqlindex.html">QSqlIndex</a> idIndex;
    };
</pre><blockquote><p align="center"><em> 来自<a href="sql-overview-form2-main-h.html">sql/overview/form2/main.h</a>
</em></p>
</blockquote><p> 这个save槽将被用于一个按纽以便让用户进行数据刷新的确认。 我们也保存<a href="qsqlcursor.html">QSqlCursor</a>和<a href="qsqlform.html">QSqlForm</a>的指针,因为它们将需要在构造函数之外被访问。
<p> 

<pre>        staffCursor.setTrimmed( "forename", TRUE );
        staffCursor.setTrimmed( "surname",  TRUE );
</pre>
<p> 我们在文本字段上调用setTrimmed()以便获取到数据的时候自动消除右面的空格。
<p> 我们可以根据需要设置一些属性,比如对齐方式与有效性检查。相对应的函数为QLineEdit::setAlignment与QLineEdit::setValidator。 
<p> <pre>        <a href="qlineedit.html">QLineEdit</a>   *forenameEdit  = new <a href="qlineedit.html">QLineEdit</a>( this );
</pre>
<p> <pre>        <a href="qpushbutton.html">QPushButton</a> *saveButton    = new <a href="qpushbutton.html">QPushButton</a>( "&amp;Save", this );
        <a href="qobject.html#connect">connect</a>( saveButton, SIGNAL(<a href="qbutton.html#clicked">clicked</a>()), this, SLOT(save()) );
</pre>
<p> FormDialog的构造函数类似于先前的实例。我们更改forename与surname窗口部件的类型至QLineEdits以便使其内容可编辑。然后又加入<a href="qpushbutton.html">QPushButton</a>以便用户点击确认保存他们的更新。 
<p> <pre>    <a name="x2229"></a>    grid-&gt;<a href="qgridlayout.html#addWidget">addWidget</a>( saveButton,    3, 0 );
</pre>
<p> 我们在网格中添加了一行来容纳这个save按钮。
<p> <pre>        idIndex = staffCursor.index( "id" );
        staffCursor.select( idIndex );
        staffCursor.first();
</pre>
<p> 我们创建了一个<a href="qsqlindex.html">QSqlIndex</a>对象然后使用索引执行一个select()操作。然后定位至第一条记录。
<p> <pre>        sqlForm = new <a href="qsqlform.html">QSqlForm</a>( this );
    <a name="x2232"></a>    sqlForm-&gt;<a href="qsqlform.html#setRecord">setRecord</a>( staffCursor.primeUpdate() );
</pre>
<p> 我们创建了一个新的<a href="qsqlform.html">QSqlForm</a>对象并把它的缓冲区与游标的更新缓冲区关联起来。
<p> <pre>    <a name="x2230"></a>    sqlForm-&gt;<a href="qsqlform.html#insert">insert</a>( forenameEdit, "forename" );
        sqlForm-&gt;<a href="qsqlform.html#insert">insert</a>( surnameEdit, "surname" );
        sqlForm-&gt;<a href="qsqlform.html#insert">insert</a>( salaryEdit, "salary" );
    <a name="x2231"></a>    sqlForm-&gt;<a href="qsqlform.html#readFields">readFields</a>();
</pre>
<p> 现在我们把缓冲区的各个字段与<a href="qlineedit.html">QLineEdit</a>控件关联起来。(在先前的实例中我们把它与游标的各个字段相关联)。函数readFields()使得各控件获得数据。 
<p> <pre>    FormDialog::~FormDialog()
    {

    }
</pre>
<p> 在析构函数中我们无需关注各控件或QSqlForm的处理,由于它们都是窗体的孩子,因此将被Qt在适当的时候清除。
<p> <pre>    void FormDialog::save()
    {
    <a name="x2233"></a>    sqlForm-&gt;<a href="qsqlform.html#writeFields">writeFields</a>();
        staffCursor.update();
        staffCursor.select( idIndex );
        staffCursor.first();
    }
</pre>
<p> 最后我们加入了保存这一个功能,当用户点击保存按纽时该函数将被执行。最后我们调用writeFields()使得数据回写入<a href="qsqlrecord.html">QSqlRecord</a>缓冲区。然后我们利用游标的update()函数来更新数据。此后游标不再可用,因此使用<a href="qsqlindex.html">QSqlIndex</a>再次调用select()来获得数据并定位至第一条记录。
<p> <a href="qdatabrowser.html">QDataBrowser</a>和<a href="qdataview.html">QDataView</a>这两个窗口部件提供了以上这些功能的许多函数。<a href="qdatabrowser.html">QDataBrowser</a>提供了一个数据标识来指明是否允许编辑与记录浏览。<a href="qdataview.html">QDataView</a>提供了一个数据的只读形式。相关资料可查看类文档或<em>Qt设计器</em>的手册。
<p> 链接到<a href="sql.html">sql/overview/form2/main.cpp</a>
<p> <a name="Custom_Editor_Widgets"></a>
<h3> 自定义编辑器窗口部件
</h3>
<a name="8-3"></a><p> <a href="qsqlform.html">QSqlForm</a>使用了<a href="qsqlpropertymap.html">QSqlPropertyMap</a>来控制数据在组件与数据库字段间的传输。自定义窗口部件同样可以使用属性映射,其中包含了如何转递数据的信息。
<p> 本实例基于前述的form2实例。因此这里只讲述不同部分,完整源码在<a href="sql-overview-custom1-main-h.html">sql/overview/custom1/main.h</a>和<a href="sql-overview-custom1-main-cpp.html">sql/overview/custom1/main.cpp</a>
<p> 

<pre>    class CustomEdit : public <a href="qlineedit.html">QLineEdit</a>
    {
        Q_OBJECT
        Q_PROPERTY( QString upperLine READ upperLine WRITE setUpperLine )
        public:
            CustomEdit( <a href="qwidget.html">QWidget</a> *parent=0, const char *name=0 );
            <a href="qstring.html">QString</a> upperLine() const;
            void setUpperLine( const <a href="qstring.html">QString</a> &amp;line );
        public slots:
            void changed( const <a href="qstring.html">QString</a> &amp;line );
        private:
            <a href="qstring.html">QString</a> upperLineText;
    };
</pre>
<p> 我们从<a href="qlineedit.html">QLineEdit</a>这儿继承了一个类,加入了属性:upperLineText,以便其中存放字符串的大写。加入一个changed槽。
<p> <pre>            <a href="qsqlpropertymap.html">QSqlPropertyMap</a> *propMap;
</pre>
<p> 由于我们将使用属性映射因此我们把属性映射的指针与FormDialog的私有数据关联起来。
<p> 

<pre>    CustomEdit::CustomEdit( <a href="qwidget.html">QWidget</a> *parent, const char *name ) :
        <a href="qlineedit.html">QLineEdit</a>( parent, name )
    {
        <a href="qobject.html#connect">connect</a>( this, SIGNAL(<a href="qlineedit.html#textChanged">textChanged</a>(const <a href="qstring.html">QString</a> &amp;)),
                 this, SLOT(changed(const <a href="qstring.html">QString</a> &amp;)) );
    }
</pre>
<p> 在CustomEdit的构造函数中,我们执行了QLineEdit的构造函数,然后在textChanged信号与changed槽之间建立了连接。
<p> <pre>    void CustomEdit::changed( const <a href="qstring.html">QString</a> &amp;line )
    {
        setUpperLine( line );
    }
</pre>
<p> changed()槽调用setUpperLine()这个函数。 
<p> <pre>    void CustomEdit::setUpperLine( const <a href="qstring.html">QString</a> &amp;line )
    {
    <a name="x2239"></a>    upperLineText = line.<a href="qstring.html#upper">upper</a>();
        setText( upperLineText );
    }
</pre>
<p> setUpperLine()函数将对文本进行处理以获得一份大写后的拷贝并把它设置成窗口部件的数据。
<p> 我们的CustomEdit类确保输入的数据始终是大写并提供了一个属性以便在属性映

⌨️ 快捷键说明

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