4-主窗口
- 1、简介
- 2 菜单栏、工具栏、状态栏
- 2.1 菜单栏
- 2.2 QAction
- 2.3 工具栏
- 2.4 状态栏
- 3 混合方式UI设计
1、简介
- QMainWindow是一个为用户提供主窗口程序的类,包含一个菜单栏、多个工具栏、多个停靠控件、一个状态栏以及一个中心控件,是许多应用程序(比如文本编辑器、图片编辑器等)的基础。
- 主窗口具有自己的布局管理器,因此不允许在主窗口上设置或创建布局管理器。但是在中心控件上可以设置。
2 菜单栏、工具栏、状态栏
2.1 菜单栏
- 菜单是一些列命令的列表
- 为了实现菜单、工具栏按钮、键盘快捷方式等命令的一致性,Qt使用动作(QAction)来表示这些命令
- Qt的菜单就是由一系列的QAction动作对象构成的列表
- 菜单栏是包含菜单的面板,位于主窗口标题栏的下面
- 一个主窗口只能有一个菜单栏
2.2 QAction
- QAction类提供了抽象的用户界面action,这些action可以被放置在窗口控件中
- QAction可以被添加到菜单和工具栏中,并且可以自动保持在菜单和工具栏中的同步。
- QAction是可以作为独立的对象被创建,也可以在构建菜单时创建。
- QAction可以包含一个图标、菜单文本、快捷键、状态文本等。
- 只有将QAction添加到窗口控件上,才可以使用这些QAction。
2.3 工具栏
- 工具栏是由一系列的类似于按钮的动作排列而成的面板,它通常由一些经常使用的命令(动作)组成
- 工具栏位于菜单栏的下面、状态栏的上面,可以停靠在主窗口的上下左右四个方向
- 一个主窗口可以包含多个工具栏
2.4 状态栏
- 提供一个用于展示状态信息的水平栏
3 混合方式UI设计
- 可视化UI设计无需人工编写代码区处理大量繁琐的界面组件的创建和布局管理工作,可以直观地进行界面设计,大大提高工作效率。但某些组件无法可视化地添加到界面上。
- 采用纯代码方式进行UI设计虽然无所不能,但是设计效率太低,过程非常繁琐。
- 混合方式创建UI,即部分界面设计用UI设计器可视化实现,部分无法在UI设计器里实现的界面设计用代码实现。
案列:实现下面的窗口及其功能
1: 新建工程名为Editor,基类是QMainWindow,UI组件选择Text Edit,在窗口上选择控件-》视图-》action editor,在弹出的窗口中,新建下面的选项
2:设计菜单栏
在窗口上方输入文件,然后将action控件拖入其中
将控件拖入,当上方出现红色线条时,就说明成功了
然后依次完成以下页面的设计
3:设计工具栏
在窗口空白处单击,选择添加工具栏,依次将action控件拖入其中,效果如下
4:设计相关的槽函数,其中粘贴、剪切、复制、退出和清空不需要我们自定义槽函数,可以在页面上选择,其他均需要生成对应的槽函数。页面可选择如下:
自己选择的如下:
其中粗体、斜体、下划线、工具栏、状态栏是需要选择triggered(bool checked)这个槽函数的
在Text Edit控件中需要选择两个槽函数
5:根据原图,我们还需要字体和字号的控件,这俩需要我们自己书写定义
private:
// 自定义的槽函数void on_m_combFontName_currentIndexChanged(const QString &fontName);void on_m_spinFontSize_valueChanged(int fontSize);
// 变量QFontComboBox * m_combFontName;// 字体组合框对象指针QSpinBox* m_spinFontSize;// 存储字号QLabel* m_labCurFile;//当前文件
6:书写逻辑,源文件如下
EditorWindow::EditorWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::EditorWindow)
{ui->setupUi(this);// 设置中心组件setCentralWidget(ui->m_edit);// 设计工具栏ui->toolBar->addSeparator();// 添加分隔符 在当前工具栏的末尾添加ui->toolBar->addWidget(new QLabel(" 字体大小:"));// 字号大小m_spinFontSize = new QSpinBox; // 字号选择框m_spinFontSize->setMinimumWidth(60);//最小的宽度m_spinFontSize->setRange(8,72);// 字号大小的范围ui->toolBar->addWidget(m_spinFontSize);ui->toolBar->addWidget(new QLabel(" 字体名称:")); // 字体名称m_combFontName = new QFontComboBox;// 字体选择框m_combFontName->setMinimumWidth(80);//最小的宽度ui->toolBar->addWidget(m_combFontName);m_labCurFile = new QLabel("当前文件: "); // 添加尾部状态栏m_labCurFile->setMinimumWidth(400);ui->statusbar->addWidget(m_labCurFile);//建立信号和槽的连接// 字体选择connect(m_combFontName,SIGNAL(currentIndexChanged(QString)),this,SLOT(on_m_combFontName_currentIndexChanged(QString)));// 字号选择connect(m_spinFontSize,SIGNAL(valueChanged(int)),this,SLOT(on_m_spinFontSize_valueChanged(int)));
}
// 新建的槽函数
void EditorWindow::on_m_actNew_triggered(){QMessageBox::information(this,windowTitle(),"新建 文件 等待 处理");
}
// 打开的槽函数
void EditorWindow::on_m_actOpen_triggered()
{QMessageBox::information(this,windowTitle(),"打开 文件 等待 处理");}// 粗体的槽函数void EditorWindow::on_m_actBold_triggered(bool checked){QTextCharFormat fmt;fmt.setFontWeight(checked ? QFont::Bold : QFont::Normal);ui->m_edit->mergeCurrentCharFormat(fmt);
}
// 斜体的槽函数
void EditorWindow::on_m_actItalic_triggered(bool checked)
{QTextCharFormat fmt;fmt.setFontItalic(checked);ui->m_edit->mergeCurrentCharFormat(fmt);
}
// 下划线的槽函数
void EditorWindow::on_m_actUnderline_triggered(bool checked)
{QTextCharFormat fmt;fmt.setFontUnderline(checked);ui->m_edit->mergeCurrentCharFormat(fmt);
}
// 状态栏的槽函数
void EditorWindow::on_m_actStatusbar_triggered(bool checked)
{ui->statusbar->setHidden(!checked);
}
// 工具栏的槽函数
void EditorWindow::on_m_actToolbar_triggered(bool checked)
{ui->toolBar->setHidden(!checked);
}
// 关于的槽函数
void EditorWindow::on_m_actAbout_triggered()
{QMessageBox::information(this,windowTitle(),"关于 文件 等待 处理");
}
// 文本框 可复制槽函数
//何时m_edit中的信息可以被拷贝 - 复制/剪切
//如果不能复制和剪切 - 将两个QAction禁用
//文本框 文字改变槽函数
void EditorWindow::on_m_edit_copyAvailable(bool b)
{// 复制使能ui->m_actCopy->setEnabled(b);// 剪切使能ui->m_actCut->setEnabled(b);
}
// 文本发生改变的 槽函数 文本发生改变时判断是否可以清空
void EditorWindow::on_m_edit_textChanged()
{ui->m_actClear->setEnabled(ui->m_edit->toPlainText().size());
}
// 文本框 文本选择改变槽函数
void EditorWindow::on_m_edit_selectionChanged()
{// 当有文本选中时,查看对应文本已经设置的格式QFont font = ui->m_edit->currentFont();ui->m_actBold->setChecked(font.bold());//粗体ui->m_actItalic->setChecked(font.italic());//斜体ui->m_actUnderline->setChecked(font.underline());//下划线m_combFontName->setCurrentFont(font);// 字体m_spinFontSize->setValue(font.pointSize());
}
// 字体变化槽函数
void EditorWindow::on_m_combFontName_currentIndexChanged(const QString &fontName){QTextCharFormat fmt;fmt = ui->m_edit->currentCharFormat();fmt.setFontFamily(fontName);ui->m_edit->mergeCurrentCharFormat(fmt);
}
// 字号变化槽函数
void EditorWindow::on_m_spinFontSize_valueChanged(int fontSize){QTextCharFormat fmt;fmt = ui->m_edit->currentCharFormat();fmt.setFontPointSize(fontSize);ui->m_edit->mergeCurrentCharFormat(fmt);
}