22-代码创建其他界面组件
2.4.5 代码创建其他界面组件
至此,在UI设计器里已经设计了这个应用程序的主要界面功能。现在想要实现如图2-16所示的界面,在工具栏上增加一个SpinBox用于设置字体大小,增加一个FontComboBox来选择字体。当从组件面板里拖放一个SpinBox到工具栏上时,却发现工具栏“拒收”!同样,在状态栏上放一个Label和一个ProgreeBar也是被“拒收”的。这是UI设计器的局限性,某些界面效果无法用可视化设计方式实现。
为此,需要编写一些代码来实现这些无法可视化设计的界面功能。先在QWMainWind类定义里增加一些变量和函数定义,增加的定义如下:
class QWMainWind : public QMainWindow
{
private:
QLabel *fLabCurFile;//状态栏里显示当前文件的Label
QProgressBar *progressBar1;//状态栏上的进度条
QSpinBox *spinFontSize;// 字体大小spinBox
QFontComboBox *comboFont;//字体名称comboBox
void iniUI(); //代码实现的UI初始化
};
iniUI()函数用于创建这些界面组件,并添加到工具栏或状态栏,其实现代码如下:
void QWMainWind::iniUI()
{//状态栏上添加组件
fLabCurFile=new QLabel;
fLabCurFile->setMinimumWidth(150);
fLabCurFile->setText("当前文件:");
ui->statusBar->addWidget(fLabCurFile);//添加到状态栏
progressBar1=new QProgressBar;
progressBar1->setMaximumWidth(200);
progressBar1->setMinimum(5);
progressBar1->setMaximum(50);
progressBar1->setValue(ui->txtEdit->font().pointSize());
ui->statusBar->addWidget(progressBar1); //添加到状态栏
//工具栏上添加组件
spinFontSize = new QSpinBox;//文字大小 SpinBox
spinFontSize->setMinimum(5);
spinFontSize->setMaximum(50);
spinFontSize->setValue(ui->txtEdit->font().pointSize());
spinFontSize->setMinimumWidth(50);
ui->mainToolBar->addWidget(new QLabel("字体大小 "));
ui->mainToolBar->addWidget(spinFontSize); //SpinBox添加到工具栏
ui->mainToolBar->addSeparator(); //分隔条
ui->mainToolBar->addWidget(new QLabel(" 字体 "));
comboFont = new QFontComboBox;
comboFont->setMinimumWidth(150);
ui->mainToolBar->addWidget(comboFont);//添加到工具栏
setCentralWidget(ui->txtEdit);
}
iniUI()函数实现如下的功能。
- 创建一个Qlabel类型的组件fLabCurFile并将其添加到状态栏。
- 创建一个QProgressBar类型的组件progressBar1并添加到状态栏。
- 创建QSpinBox 类型组件spinFontSize并设置其属性,然后添加到工具栏。
- 创建一个QFontComboBox类型的组件并添加到工具栏里。
实现了iniUI()函数之后,在QWMainWind的构造函数里调用iniUI()函数,现在的构造函数代码实现如下:
QWMainWind::QWMainWind(QWidget *parent) : QMainWindow(parent),
ui(new Ui::QWMainWind)
{
ui->setupUi(this);
iniUI();
}
注意 iniUI()函数一定要在 ui->setupUi(this)之后再调用,两行语句的先后顺序不能调换。因为ui-> setupUi(this)实现了可视化设计的界面的创建,iniUI()是在可视化创建的界面基础之上添加其他组件,所以必须在其后面调用。
现在编译后运行就可以出现如图2-17所示的界面了,界面由可视化设计和代码设计混合实现。