| 主页 | 所有的类 | 主要的类 | 注释的类 | 分组的类 | 函数 |

我们提供了一个选项对话框,这样用户就可以在一个地方对所有的数据组设置选项。
(由optionsform.h展开。)
class OptionsForm : public QDialog
{
Q_OBJECT
public:
OptionsForm( QWidget* parent = 0, const char* name = "options form",
bool modal = FALSE, WFlags f = 0 );
~OptionsForm() {}
QFont font() const { return m_font; }
void setFont( QFont font );
QLabel *chartTypeTextLabel;
QComboBox *chartTypeComboBox;
QPushButton *fontPushButton;
QLabel *fontTextLabel;
QFrame *addValuesFrame;
QButtonGroup *addValuesButtonGroup;
QRadioButton *noRadioButton;
QRadioButton *yesRadioButton;
QRadioButton *asPercentageRadioButton;
QLabel *decimalPlacesTextLabel;
QSpinBox *decimalPlacesSpinBox;
QPushButton *okPushButton;
QPushButton *cancelPushButton;
protected slots:
void chooseFont();
protected:
QVBoxLayout *optionsFormLayout;
QHBoxLayout *chartTypeLayout;
QHBoxLayout *fontLayout;
QVBoxLayout *addValuesFrameLayout;
QVBoxLayout *addValuesButtonGroupLayout;
QHBoxLayout *decimalPlacesLayout;
QHBoxLayout *buttonsLayout;
private:
QFont m_font;
};
这个对话框的布局比设置数据视窗要更复杂一些,但是我们只需要一个单一的槽。不像“聪明的”设置数据视窗那样,这是一个“哑的”对话框,它只向窗口部件的调用者提供了读和写。调用者有责任基于用户所作的改变更新事物。
(由optionsform.cpp展开。)
#include "images/options_horizontalbarchart.xpm"
#include "images/options_piechart.xpm"
#include "images/options_verticalbarchart.xpm"
我们包含了一些在图表类型组合框中要使用的图片。
OptionsForm::OptionsForm( QWidget* parent, const char* name,
bool modal, WFlags f )
: QDialog( parent, name, modal, f )
{
setCaption( "Chart -- Options" );
resize( 320, 290 );
我们把所有的参数传递给QDialog构造函数,设置一个题目并且设置一个初始大小。
视窗的布局将是一个包含图表类型标签和组合框的水平盒子布局,并且对于字体按钮和字体标签、小数点位置标签和微调框也是相似的。按钮也会被放在一个水平布局中,但是还会有一个间隔来把它们移到右边。显示值的单选按钮将会竖直地排列在一个框架中。所有地这些都被放在一个竖直盒子布局中。
optionsFormLayout = new QVBoxLayout( this, 11, 6 );
所有的窗口部件都被放在视窗的竖直盒子布局中。
chartTypeLayout = new QHBoxLayout( 0, 0, 6 );
图表类型标签和组合框将被并排放置。
chartTypeTextLabel = new QLabel( "&Chart Type", this );
chartTypeLayout->addWidget( chartTypeTextLabel );
chartTypeComboBox = new QComboBox( false, this );
chartTypeComboBox->insertItem( QPixmap( options_piechart ), "Pie Chart" );
chartTypeComboBox->insertItem( QPixmap( options_verticalbarchart ),
"Vertical Bar Chart" );
chartTypeComboBox->insertItem( QPixmap( options_horizontalbarchart ),
"Horizontal Bar Chart" );
chartTypeLayout->addWidget( chartTypeComboBox );
optionsFormLayout->addLayout( chartTypeLayout );
我们创建图表类型标签(带有一个加速键,稍后我们会把它和图表类型组合框联系起来)。我们也创建一个图表类型组合框,用图片和文本来填充它。我们把它们两个添加到水平布局中,并把水平布局添加到视窗的竖直布局中。
fontLayout = new QHBoxLayout( 0, 0, 6 );
fontPushButton = new QPushButton( "&Font...", this );
fontLayout->addWidget( fontPushButton );
QSpacerItem* spacer = new QSpacerItem( 0, 0,
QSizePolicy::Expanding,
QSizePolicy::Minimum );
fontLayout->addItem( spacer );
fontTextLabel = new QLabel( this ); // 必须由调用者通过setFont()来设置
fontLayout->addWidget( fontTextLabel );
optionsFormLayout->addLayout( fontLayout );
我们创建一个水平盒子布局用来保存字体按钮和字体标签。字体按钮是被直接加入的。我们添加了一个间隔用来增加效果。字体文本标签被初始化为空(因为我们不知道用户正在使用什么字体)。
addValuesFrame = new QFrame( this );
addValuesFrame->setFrameShape( QFrame::StyledPanel );
addValuesFrame->setFrameShadow( QFrame::Sunken );
addValuesFrameLayout = new QVBoxLayout( addValuesFrame, 11, 6 );
addValuesButtonGroup = new QButtonGroup( "Show Values", addValuesFrame );
addValuesButtonGroup->setColumnLayout(0, Qt::Vertical );
addValuesButtonGroup->layout()->setSpacing( 6 );
addValuesButtonGroup->layout()->setMargin( 11 );
addValuesButtonGroupLayout = new QVBoxLayout(
addValuesButtonGroup->layout() );
addValuesButtonGroupLayout->setAlignment( Qt::AlignTop );
noRadioButton = new QRadioButton( "&No", addValuesButtonGroup );
noRadioButton->setChecked( true );
addValuesButtonGroupLayout->addWidget( noRadioButton );
yesRadioButton = new QRadioButton( "&Yes", addValuesButtonGroup );
addValuesButtonGroupLayout->addWidget( yesRadioButton );
asPercentageRadioButton = new QRadioButton( "As &Percentage",
addValuesButtonGroup );
addValuesButtonGroupLayout->addWidget( asPercentageRadioButton );
addValuesFrameLayout->addWidget( addValuesButtonGroup );
用户也许选择显示它们自己的标签或者在每一个标签的末尾加上值,或者加上百分比。
我们创建一个框架来存放单选按钮并且为它们创建了一个布局。我们创建了一个按钮组(这样Qt就可以自动地处理专有的单选按钮行为了)。接下来我们创建单选按钮,并把“No”作为默认值。
小数位标签和微调框被放在另一个水平布局中,并且按钮和设置数据视窗中的按钮的排布方式非常相似。
connect( fontPushButton, SIGNAL( clicked() ), this, SLOT( chooseFont() ) );
connect( okPushButton, SIGNAL( clicked() ), this, SLOT( accept() ) );
connect( cancelPushButton, SIGNAL( clicked() ), this, SLOT( reject() ) );
我们只需要三个连接:
chartTypeTextLabel->setBuddy( chartTypeComboBox );
decimalPlacesTextLabel->setBuddy( decimalPlacesSpinBox );
我们使用setBuddy()函数来连接窗口部件和标签的加速键。
void OptionsForm::chooseFont()
{
bool ok;
QFont font = QFontDialog::getFont( &ok, m_font, this );
if ( ok )
setFont( font );
}
当用户点击Font按钮时,这个槽被调用。它简单地调用静态的QFontDialog::getFont()来获得用户选择的字体。如果他们选择了一个字体,我们调用我们的setFont()槽在字体标签中提供一个字体的文本描述。
void OptionsForm::setFont( QFont font )
{
QString label = font.family() + " " +
QString::number( font.pointSize() ) + "pt";
if ( font.bold() )
label += " Bold";
if ( font.italic() )
label += " Italic";
fontTextLabel->setText( label );
m_font = font;
}
这个函数在字体标签中显示一个被选字体的文本描述,并且在m_font成员中保存一个字体的拷贝。我们需要这个字体为成员,这样我们就会为chooseFont()提供一个默认字体。
« Taking Data | 目录 | 项目文件 »
| Copyright © 2002 Trolltech | Trademarks | 译者:Cavendish | Qt 3.0.5版
|