📄 tutorial2-08.html
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- /home/reggie/tmp/qt-3.0-reggie-5401/qt-win-commercial-3.0.5/doc/tutorial2.doc:1017 -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="Translator" content="Cavendish">
<meta name="Qt zh_CN Documents Website" content="http://www.qiliang.net/qt">
<title>获得数据</title>
<style type="text/css"><!--
h3.fn,span.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; font-family: "Times New Roman" }
--></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">主页</font></a>
| <a href="classes.html">
<font color="#004faf">所有的类</font></a>
| <a href="mainclasses.html">
<font color="#004faf">主要的类</font></a>
| <a href="annotated.html">
<font color="#004faf">注释的类</font></a>
| <a href="groups.html">
<font color="#004faf">分组的类</font></a>
| <a href="functions.html">
<font color="#004faf">函数</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>获得数据</h1>
<p>
<p> <center><img src="chart-setdata.png" alt="The set data dialog"></center>
<p> 设置数据对话框允许用户添加和编辑值,并且可以选择用来显示值的颜色和样式。用户可以可以输入标签文本并为每一个标签选择一个标签颜色。
<p> (由<tt>setdataform.h</tt>展开。)
<p>
<pre> class SetDataForm: public <a href="qdialog.html">QDialog</a>
{
<a href="metaobjects.html#Q_OBJECT">Q_OBJECT</a>
public:
SetDataForm( ElementVector *elements, int decimalPlaces,
<a href="qwidget.html">QWidget</a> *parent = 0, const char *name = "set data form",
bool modal = TRUE, WFlags f = 0 );
~SetDataForm() {}
public slots:
void setColor();
void setColor( int row, int col );
void currentChanged( int row, int col );
void valueChanged( int row, int col );
protected slots:
void accept();
private:
<a href="qtable.html">QTable</a> *table;
<a href="qpushbutton.html">QPushButton</a> *colorPushButton;
<a href="qpushbutton.html">QPushButton</a> *okPushButton;
<a href="qpushbutton.html">QPushButton</a> *cancelPushButton;
protected:
<a href="qvboxlayout.html">QVBoxLayout</a> *tableButtonBox;
<a href="qhboxlayout.html">QHBoxLayout</a> *buttonBox;
private:
ElementVector *m_elements;
int m_decimalPlaces;
};
</pre>
<p> 头文件很简单。构造函数中用一个指针指向元素矢量,这样这个“聪明的”对话框就可以直接显示并且编辑数据。我们将会解释我们在实现中所看到的槽的。
<p> (由<tt>setdataform.cpp</tt>展开。)
<p>
<pre> #include "images/pattern01.xpm"
#include "images/pattern02.xpm"
</pre>
<p> 我们创建了一个小的<tt>.XPM</tt>图片用来显示Qt支持的每一种画刷样式。我们将会在样式组合框中使用这些的。
<p> <h2> 构造函数
</h2>
<a name="1"></a><p> <pre> SetDataForm::SetDataForm( ElementVector *elements, int decimalPlaces,
<a href="qwidget.html">QWidget</a>* parent, const char* name,
bool modal, WFlags f )
: <a href="qdialog.html">QDialog</a>( parent, name, modal, f )
{
m_elements = elements;
m_decimalPlaces = decimalPlaces;
</pre>
<p> 我们传递了绝大部分参数到<a href="qdialog.html">QDialog</a>超类中。我们把元素矢量指针和所要显示的小数点位数赋给成员变量,这样它们就可以被所有的SetDataForm的成员函数访问了。
<p> <pre> <a href="qwidget.html#setCaption">setCaption</a>( "Chart -- Set Data" );
<a href="qwidget.html#resize">resize</a>( 540, 440 );
</pre>
<p> 我们为对话框设置一个标题并且重定义它的大小。
<p> <pre> tableButtonBox = new <a href="qvboxlayout.html">QVBoxLayout</a>( this, 11, 6, "table button box layout" );
</pre>
<p> 这个视窗的布局相当简单。按钮被组织在一个水平的布局中并且表和这个按钮布局通过使用tableButtonBox布局被竖直地组织在一起。
<p> <pre> table = new <a href="qtable.html">QTable</a>( this, "data table" );
<a name="x2471"></a> table-><a href="qtable.html#setNumCols">setNumCols</a>( 5 );
<a name="x2472"></a> table-><a href="qtable.html#setNumRows">setNumRows</a>( ChartForm::MAX_ELEMENTS );
<a name="x2469"></a> table-><a href="qtable.html#setColumnReadOnly">setColumnReadOnly</a>( 1, true );
table-><a href="qtable.html#setColumnReadOnly">setColumnReadOnly</a>( 2, true );
table-><a href="qtable.html#setColumnReadOnly">setColumnReadOnly</a>( 4, true );
<a name="x2470"></a> table-><a href="qtable.html#setColumnWidth">setColumnWidth</a>( 0, 80 );
table-><a href="qtable.html#setColumnWidth">setColumnWidth</a>( 1, 60 ); // Columns 1 and 4 must be equal
table-><a href="qtable.html#setColumnWidth">setColumnWidth</a>( 2, 60 );
table-><a href="qtable.html#setColumnWidth">setColumnWidth</a>( 3, 200 );
table-><a href="qtable.html#setColumnWidth">setColumnWidth</a>( 4, 60 );
<a name="x2466"></a> <a href="qheader.html">QHeader</a> *th = table-><a href="qtable.html#horizontalHeader">horizontalHeader</a>();
<a name="x2455"></a> th-><a href="qheader.html#setLabel">setLabel</a>( 0, "Value" );
th-><a href="qheader.html#setLabel">setLabel</a>( 1, "Color" );
th-><a href="qheader.html#setLabel">setLabel</a>( 2, "Pattern" );
th-><a href="qheader.html#setLabel">setLabel</a>( 3, "Label" );
th-><a href="qheader.html#setLabel">setLabel</a>( 4, "Color" );
tableButtonBox-><a href="qboxlayout.html#addWidget">addWidget</a>( table );
</pre>
<p> 我们创建一个有五列的新的<a href="qtable.html">QTable</a>,并且它的行数和元素矢量中的元素个数相同。我们让颜色和样式列只读:这是为了防止用户在这些地方输入。我们将通过让用户在颜色上点击或者定位到颜色上并且点击Color按钮时可以修改颜色。样式被放在一个组合框中,很简单地通过用户选择一个不同地样式就可以改变它。接下来我们设置合适地初始宽度,为每一列插入标签并且最后把这个表添加到tableButtonBox布局中。
<p> <pre> buttonBox = new <a href="qhboxlayout.html">QHBoxLayout</a>( 0, 0, 6, "button box layout" );
</pre>
<p> 我们创建一个水平盒子布局用来保存按钮。
<p> <pre> colorPushButton = new <a href="qpushbutton.html">QPushButton</a>( this, "color button" );
<a name="x2448"></a> colorPushButton-><a href="qbutton.html#setText">setText</a>( "&Color..." );
colorPushButton-><a href="qwidget.html#setEnabled">setEnabled</a>( false );
buttonBox-><a href="qboxlayout.html#addWidget">addWidget</a>( colorPushButton );
</pre>
<p> 我们创建一个color按钮并把它添加到buttonBox布局中。我们让这个按钮失效,只有当焦点在一个颜色单元格时,我们才会让它有效。
<p> <pre> <a href="qspaceritem.html">QSpacerItem</a> *spacer = new <a href="qspaceritem.html">QSpacerItem</a>( 0, 0, QSizePolicy::Expanding,
QSizePolicy::Minimum );
<a name="x2443"></a> buttonBox-><a href="qboxlayout.html#addItem">addItem</a>( spacer );
</pre>
<p> 因为我们想把color按钮和OK以及Cancel按钮分开,接下来我们创建一个间隔并把它添加到buttonBox布局中。
<p> <pre> okPushButton = new <a href="qpushbutton.html">QPushButton</a>( this, "ok button" );
okPushButton-><a href="qbutton.html#setText">setText</a>( "OK" );
<a name="x2457"></a> okPushButton-><a href="qpushbutton.html#setDefault">setDefault</a>( TRUE );
buttonBox-><a href="qboxlayout.html#addWidget">addWidget</a>( okPushButton );
cancelPushButton = new <a href="qpushbutton.html">QPushButton</a>( this, "cancel button" );
cancelPushButton-><a href="qbutton.html#setText">setText</a>( "Cancel" );
<a name="x2447"></a> cancelPushButton-><a href="qbutton.html#setAccel">setAccel</a>( Key_Escape );
buttonBox-><a href="qboxlayout.html#addWidget">addWidget</a>( cancelPushButton );
</pre>
<p> OK和Cancel按钮被创建了并被添加到buttonBox。我们让OK按钮为这个对话框的默认按钮,并且我们为Cancel按钮提供了一个<tt>Esc</tt>加速键。
<p> <pre> <a name="x2444"></a> tableButtonBox-><a href="qboxlayout.html#addLayout">addLayout</a>( buttonBox );
</pre>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -