📄 tutorial2-08.html
字号:
<p> 我们把buttonBox布局添加到tableButtonBox中,并且这个布局也是完整的。
<p> <pre> <a name="x2462"></a> <a href="qobject.html#connect">connect</a>( table, SIGNAL( <a href="qtable.html#clicked">clicked</a>(int,int,int,const <a href="qpoint.html">QPoint</a>&) ),
this, SLOT( setColor(int,int) ) );
<a name="x2463"></a> <a href="qobject.html#connect">connect</a>( table, SIGNAL( <a href="qtable.html#currentChanged">currentChanged</a>(int,int) ),
this, SLOT( currentChanged(int,int) ) );
<a name="x2476"></a> <a href="qobject.html#connect">connect</a>( table, SIGNAL( <a href="qtable.html#valueChanged">valueChanged</a>(int,int) ),
this, SLOT( valueChanged(int,int) ) );
<a href="qobject.html#connect">connect</a>( colorPushButton, SIGNAL( <a href="qbutton.html#clicked">clicked</a>() ), this, SLOT( setColor() ) );
<a href="qobject.html#connect">connect</a>( okPushButton, SIGNAL( <a href="qbutton.html#clicked">clicked</a>() ), this, SLOT( <a href="qdialog.html#accept">accept</a>() ) );
<a href="qobject.html#connect">connect</a>( cancelPushButton, SIGNAL( <a href="qbutton.html#clicked">clicked</a>() ), this, SLOT( <a href="qdialog.html#reject">reject</a>() ) );
</pre>
<p> 现在我们来演习一下这个视窗。
<ul>
<li> 如果用户点击了一个单元格,我们调用setColor()槽,它会检查这个单元格是否保存一个颜色,如果是的,将会调用颜色对话框。
<li> 我们把<a href="qtable.html">QTable</a>的currentChanged()信号和我们的currentChanged()槽连接起来了,举例来说,这将被用在根据用户现在所在的列来决定使color按钮有效/失效。
<li> 我们把表格的valueChanged()和我们的valueChanged()槽连接起来了,我们将会用这个来显示带有正确的小数位数的值。
<li> 如果用户点击Color按钮,我们就调用setColor()槽。
<li> OK按钮被连接到accept()槽,我们将会在这个槽里面更新元素矢量。
<li> Cancel按钮被连接到<a href="qdialog.html">QDialog</a>的reject()槽,并且这部分中不再需要更多的代码和动作。
</ul>
<p> <pre> QPixmap patterns[MAX_PATTERNS];
patterns[0] = QPixmap( pattern01 );
patterns[1] = QPixmap( pattern02 );
</pre>
<p> 我们为每一个画刷样式创建了一个图片并且把它们存储在<tt>patterns</tt>数组中。
<p> <pre> <a name="x2460"></a> <a href="qrect.html">QRect</a> rect = table-><a href="qtable.html#cellRect">cellRect</a>( 0, 1 );
<a href="qpixmap.html">QPixmap</a> pix( rect.<a href="qrect.html#width">width</a>(), rect.<a href="qrect.html#height">height</a>() );
</pre>
<p> 我们每一个颜色单元格所占用的矩形并创建一个这样大小的空白图片。
<p> <pre> for ( int i = 0; i < ChartForm::MAX_ELEMENTS; ++i ) {
Element element = (*m_elements)[i];
if ( element.isValid() )
table-><a href="qtable.html#setText">setText</a>(
i, 0,
QString( "%1" ).arg( element.value(), 0, 'f',
m_decimalPlaces ) );
<a href="qcolor.html">QColor</a> color = element.valueColor();
pix.<a href="qpixmap.html#fill">fill</a>( color );
table-><a href="qtable.html#setPixmap">setPixmap</a>( i, 1, pix );
table-><a href="qtable.html#setText">setText</a>( i, 1, color.<a href="qcolor.html#name">name</a>() );
<a href="qcombobox.html">QComboBox</a> *combobox = new <a href="qcombobox.html">QComboBox</a>;
for ( int j = 0; j < MAX_PATTERNS; ++j )
combobox-><a href="qcombobox.html#insertItem">insertItem</a>( patterns[j] );
<a name="x2453"></a> combobox-><a href="qcombobox.html#setCurrentItem">setCurrentItem</a>( element.valuePattern() - 1 );
<a name="x2468"></a> table-><a href="qtable.html#setCellWidget">setCellWidget</a>( i, 2, combobox );
table-><a href="qtable.html#setText">setText</a>( i, 3, element.label() );
color = element.labelColor();
<a name="x2456"></a> pix.<a href="qpixmap.html#fill">fill</a>( color );
<a name="x2473"></a> table-><a href="qtable.html#setPixmap">setPixmap</a>( i, 4, pix );
<a name="x2474"></a><a name="x2450"></a> table-><a href="qtable.html#setText">setText</a>( i, 4, color.<a href="qcolor.html#name">name</a>() );
</pre>
<p> 对于元素矢量中的每一个元素,我们必须填充表格。
<p> 如果元素是有效的,我们把它的值写在第一列(0列,Value),根据指定的小数点位数进行格式化。
<p> 我们读元素的值颜色并用这种颜色填充空白图片,然后我们让颜色单元格显示这个图片。我们需要能够在以后读到这个颜色(比如用户改变了颜色)。一个方法就是测试图片中的一个像素,另一个就是继承<a href="qtableitem.html">QTableItem</a>(和我们继承CanvasText类似)并且在里面存储这个颜色。但是我们用了一个简单的方法:我们设置这个单元格的文本为这个颜色的名字。
<p> 接下来我们用样式来填充样式组合框。我们将通过使用被选择的样式在组合框中的位置来决定用户选择了哪一个样式。<a href="qtable.html">QTable</a>可以利用<a href="qcombotableitem.html">QComboTableItem</a>条目,但是只支持文本,所以我们使用setCellWidget()来代替把<a href="qcombobox.html">QComboBox</a>的插入到表中。
<p> 接下来我们插入元素的标签。最后我们用我们设置值颜色的方法来设置标签颜色。
<p> <h2> 槽
</h2>
<a name="2"></a><p> <pre> void SetDataForm::currentChanged( int row, int col )
{
colorPushButton-><a href="qwidget.html#setEnabled">setEnabled</a>( col == 1 || col == 4 );
if ( col == 2 )
<a name="x2461"></a> ((QComboBox*)table-><a href="qtable.html#cellWidget">cellWidget</a>( row, col ))->popup();
}
</pre>
<p> 当用户进行定位时,表的currentChanged()信号被发射。如果用户进入1或4列时(值颜色或标签颜色),我们让colorPushButton生效,否则让它失效。
<p> 为了给键盘用户提供方便,如果用户定位到样式组合框中时,我们弹出它。
<p> <pre> void SetDataForm::valueChanged( int row, int col )
{
if ( col == 0 ) {
bool ok;
<a name="x2475"></a> double d = table-><a href="qtable.html#text">text</a>( row, col ).toDouble( &ok );
if ( ok && d > EPSILON )
table-><a href="qtable.html#setText">setText</a>(
row, col, QString( "%1" ).arg(
d, 0, 'f', m_decimalPlaces ) );
else
table-><a href="qtable.html#setText">setText</a>( row, col, table-><a href="qtable.html#text">text</a>( row, col ) + "?" );
}
}
</pre>
<p> 如果用户改变值,我们必须使用正确的小数位数对它进行格式化,或者指出它是无效的。
<p> <pre> void SetDataForm::setColor()
{
<a name="x2465"></a><a name="x2464"></a> setColor( table-><a href="qtable.html#currentRow">currentRow</a>(), table-><a href="qtable.html#currentColumn">currentColumn</a>() );
table-><a href="qwidget.html#setFocus">setFocus</a>();
}
</pre>
<p> 如果用户按下Color按钮,我们调用另一个setColor()函数并把焦点返回到表中。
<p> <pre> void SetDataForm::setColor( int row, int col )
{
if ( !( col == 1 || col == 4 ) )
return;
<a name="x2451"></a> <a href="qcolor.html">QColor</a> color = QColorDialog::<a href="qcolordialog.html#getColor">getColor</a>(
QColor( table-><a href="qtable.html#text">text</a>( row, col ) ),
this, "color dialog" );
<a name="x2449"></a> if ( color.<a href="qcolor.html#isValid">isValid</a>() ) {
<a name="x2467"></a> <a href="qpixmap.html">QPixmap</a> pix = table-><a href="qtable.html#pixmap">pixmap</a>( row, col );
pix.<a href="qpixmap.html#fill">fill</a>( color );
table-><a href="qtable.html#setPixmap">setPixmap</a>( row, col, pix );
table-><a href="qtable.html#setText">setText</a>( row, col, color.<a href="qcolor.html#name">name</a>() );
}
}
</pre>
<p> 如果当焦点在一个颜色单元格中时这个函数被调用,我们调用静态的<a href="qcolordialog.html#getColor">QColorDialog::getColor</a>()对话框来获得用户所选择的颜色。如果他们选择了一个颜色,我们就用这种颜色来填充颜色单元格的图片,并且设置单元格的文本为新的颜色的名称。
<p> <pre> <a name="x2454"></a>void SetDataForm::<a href="qdialog.html#accept">accept</a>()
{
bool ok;
for ( int i = 0; i < ChartForm::MAX_ELEMENTS; ++i ) {
Element &element = (*m_elements)[i];
double d = table-><a href="qtable.html#text">text</a>( i, 0 ).toDouble( &ok );
if ( ok )
element.setValue( d );
else
element.setValue( Element::INVALID );
element.setValueColor( QColor( table-><a href="qtable.html#text">text</a>( i, 1 ) ) );
element.setValuePattern(
((QComboBox*)table-><a href="qtable.html#cellWidget">cellWidget</a>( i, 2 ))->currentItem() + 1 );
element.setLabel( table-><a href="qtable.html#text">text</a>( i, 3 ) );
element.setLabelColor( QColor( table-><a href="qtable.html#text">text</a>( i, 4 ) ) );
}
QDialog::<a href="qdialog.html#accept">accept</a>();
}
</pre>
<p> 如果用户点击OK,我们必须更新元素矢量。我们对矢量进行迭代并把每一个元素的值设置为用户输入的值,否则如果值是无效的就设置为<tt>INVALID</tt>。我们通过颜色的名称作为参数临时构造一个<a href="qcolor.html">QColor</a>来设置值颜色和标签颜色。样式被设置为样式组合框的当前条目与1的偏移量(因为我们的样式数字是从1开始的,但是组合框的条目是从0开始索引的)。
<p> 最后我们调用<a href="qdialog.html#accept">QDialog::accept</a>()。
<p> <p align=right>
<a href="tutorial2-07.html">« 文件处理</a> |
<a href="tutorial2.html">目录</a> |
<a href="tutorial2-09.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 + -