📄 tutorial2-03.html
字号:
#include <<a href="qstringlist-h.html">qstringlist.h</a>>
#include <<a href="qtextstream-h.html">qtextstream.h</a>>
</pre>
<p> 我们对于操作符的实现需要包含<a href="qtextstream-h.html">qtextstream.h</a>和<a href="qstringlist-h.html">qstringlist.h</a>。
<p> <pre> const char FIELD_SEP = ':';
const char PROPOINT_SEP = ';';
const char XY_SEP = ',';
</pre>
<p> 我们用来存储数据的格式是用冒号来分隔字段,用换行来分隔记录。比例点用分号间隔,它们的x和y使用逗号分隔。字段的顺序是值、值的颜色、值的样式、标签颜色、标签点、标签文本。比如:
<pre>
20:#ff0000:14:#000000:0.767033,0.412946;0,0.75;0,0:Red :with colons:!
70:#00ffff:2:#ffff00:0.450549,0.198661;0.198516,0.125954;0,0.198473:Cyan
35:#0000ff:8:#555500:0.10989,0.299107;0.397032,0.562977;0,0.396947:Blue
55:#ffff00:1:#000080:0.0989011,0.625;0.595547,0.312977;0,0.59542:Yellow
80:#ff00ff:1:#000000:0.518681,0.694196;0.794063,0;0,0.793893:Magenta or Violet
</pre>
<p> 我们阅读<tt>Element</tt>数据的方式中对于文本标签中的空白符和字段间隔符都没有问题。
<p> <pre> QTextStream &operator<<( <a href="qtextstream.html">QTextStream</a> &s, const Element &element )
{
s << element.value() << FIELD_SEP
<< element.valueColor().name() << FIELD_SEP
<< element.valuePattern() << FIELD_SEP
<< element.labelColor().name() << FIELD_SEP;
for ( int i = 0; i < Element::MAX_PROPOINTS; ++i ) {
s << element.proX( i ) << XY_SEP << element.proY( i );
s << ( i == Element::MAX_PROPOINTS - 1 ? FIELD_SEP : PROPOINT_SEP );
}
s << element.label() << '\n';
return s;
}
</pre>
<p> 写元素就是一直向前。每一个成员后面都被写一个字段间隔符。点被写成由逗号间隔的(<tt>XY_SEP</tt>)x和y的组合,每一对由<tt>PROPOINT_SEP</tt>分隔符分隔。最后一个字段是标签和接着的换行符。
<p> <pre> QTextStream &operator>>( <a href="qtextstream.html">QTextStream</a> &s, Element &element )
{
<a name="x2401"></a> <a href="qstring.html">QString</a> data = s.<a href="qtextstream.html#readLine">readLine</a>();
element.setValue( Element::INVALID );
int errors = 0;
bool ok;
<a name="x2400"></a> <a href="qstringlist.html">QStringList</a> fields = QStringList::<a href="qstringlist.html#split">split</a>( FIELD_SEP, data );
<a name="x2403"></a> if ( fields.<a href="qvaluelist.html#count">count</a>() >= 4 ) {
double value = fields[0].toDouble( &ok );
if ( !ok )
errors++;
<a href="qcolor.html">QColor</a> valueColor = QColor( fields[1] );
<a name="x2398"></a> if ( !valueColor.<a href="qcolor.html#isValid">isValid</a>() )
errors++;
int valuePattern = fields[2].toInt( &ok );
if ( !ok )
errors++;
<a href="qcolor.html">QColor</a> labelColor = QColor( fields[3] );
if ( !labelColor.<a href="qcolor.html#isValid">isValid</a>() )
errors++;
<a href="qstringlist.html">QStringList</a> propoints = QStringList::<a href="qstringlist.html#split">split</a>( PROPOINT_SEP, fields[4] );
<a name="x2399"></a> <a href="qstring.html">QString</a> label = data.<a href="qstring.html#section">section</a>( FIELD_SEP, 5 );
if ( !errors ) {
element.set( value, valueColor, valuePattern, label, labelColor );
int i = 0;
<a name="x2402"></a> for ( QStringList::iterator point = propoints.<a href="qvaluelist.html#begin">begin</a>();
<a name="x2404"></a> i < Element::MAX_PROPOINTS && point != propoints.<a href="qvaluelist.html#end">end</a>();
++i, ++point ) {
errors = 0;
<a href="qstringlist.html">QStringList</a> xy = QStringList::<a href="qstringlist.html#split">split</a>( XY_SEP, *point );
double x = xy[0].toDouble( &ok );
if ( !ok || x <= 0.0 || x >= 1.0 )
errors++;
double y = xy[1].toDouble( &ok );
if ( !ok || y <= 0.0 || y >= 1.0 )
errors++;
if ( errors )
x = y = Element::NO_PROPORTION;
element.setProX( i, x );
element.setProY( i, y );
}
}
}
return s;
}
</pre>
<p> 为了读取一个元素我们读取一条记录(比如一行)。我们使用<a href="qstringlist.html#split">QStringList::split</a>()来把数据分成字段。因为标签中有可能包含<tt>FIELD_SEP</tt>字符,所以我们使用<a href="qstring.html#section">QString::section</a>()来获得从最后一个字段到这一行结尾的所有文本。如果获得了足够的字段和值,颜色和样式数据是有效的,我们使用<tt>Element::set()</tt>来把这些数据写到元素中,否则我们就会设置这个元素为<tt>INVALID</tt>。然后我们对点也是这样。如果x和y比例是有效的并且在范围内,我们将会为元素设置它们。如果一个或两个比例是无效的,它们将认为值为零,这样是不合适的,所以我们将会改变无效的(和超出范围的)比例点的值为<tt>NO_PROPORTION</tt>。
<p> 我们的<tt>Element</tt>类现在足够用来存储、维护和读写元素数据了。我们也创建了一个元素矢量类型定义来存储一个元素的集合。
<p> 我们现在已经准备好通过我们的用户来生成、编辑和可视化他们的数据组来生成<tt>main.cpp</tt>和用户界面。
<p> <center><table cellpadding="4" cellspacing="2" border="0">
<tr bgcolor="#f0f0f0">
<td valign="top">如果要获得更多的有关Qt的数据流工具请看<a href="datastreamformat.html">QDataStream操作符格式</a>,和任何一个被提及的和你所要存储的东西相似的Qt类的源代码。
</table></center>
<p> <p align=right>
<a href="tutorial2-02.html">« “大图片”</a> |
<a href="tutorial2.html">目录</a> |
<a href="tutorial2-04.html">主体很容易 »</a>
</p>
<p>
<!-- 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><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 + -