个人主页~
Qt窗口
- 一、菜单栏
- 二、工具栏
- 三、状态栏
- 四、浮动窗口
- 五、对话框
- 1、简介
- (1)模态对话框
- (2)非模态对话框
- (3)混合属性对话框
Qt窗口是通过QMainWindow类来实现的,我们之前的学习是通过QWidget类实现的
QMainWindow包含一个菜单栏Menu Bar②,多个工具栏Tool Bars③,多个浮动窗口Dock Widgets,一个状态栏Status Bar⑤和一个中心部件Central Widget④
①是Window Title
一、菜单栏
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//设置窗口名
this->setWindowTitle("我的word文件");
//创建菜单栏,将菜单栏设置到窗口当中
QMenuBar* mb = new QMenuBar(this);
this->setMenuBar(mb);
//设置菜单名,将菜单设置到菜单栏中
QMenu* m = new QMenu("文件");
mb->addMenu(m);
//设置菜单项,将菜单项设置到菜单当中
QAction* a1 = new QAction("打开");
QAction* a2 = new QAction("保存");
QAction* a3 = new QAction("关闭");
m->addAction(a1);
m->addAction(a2);
m->addAction(a3);
//设置中心部件
QTextEdit* te = new QTextEdit(this);
this->setCentralWidget(te);
te->setPlaceholderText("请输入");
}
menubar
让我们加上对应的功能
connect(a1,&QAction::triggered,this,&MainWindow::load);
connect(a2,&QAction::triggered,this,&MainWindow::save);
connect(a3,&QAction::triggered,this,&MainWindow::quit);
void MainWindow::save()
{
//创建文件对话框
QFileDialog* dg = new QFileDialog(this);
//根据文件名创建文本文件
QString filename = dg->getSaveFileName(this,"保存文件","C:/Users/14725/Desktop");
qDebug() << filename;
//将filename转换成一个标准C字符串,然后使用这个路径来创建一个std::ofstream对象file,以便打开并写入文件
std::ofstream file(filename.toStdString().c_str());
if(!file.is_open())
{
qDebug() << "文件保存失败";
return;
}
//将textedit中的内容通过普通文本存放在text中
const QString& text = te->toPlainText();
//通过流输入到file文件
file << text.toStdString();
//关闭文件
file.close();
}
void MainWindow::load()
{
//创建文件对话框
QFileDialog* d = new QFileDialog(this);
//获取到指定位置的文件名
QString filename = d->getOpenFileName(this,"加载文件","C:/Users/14725/Desktop");
//将filename转换成一个标准C字符串,然后使用这个路径来创建一个std::ifstream对象file,以便加载文件
std::ifstream file(filename.toStdString().c_str());
if(!file.is_open())
{
qDebug() << "文件加载失败";
return;
}
//创建两个字符串
std::string content;
std::string line;
//一行一行从文件中扫描输入到content
while (std::getline(file, line))
{
content += line;
content += "\n";
}
//关闭文件
file.close();
//获取到content内容,呈现到textedit当中
QString text = QString::fromStdString(content);
te->setPlainText(text);
}
menubar_2
二、工具栏
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//创建工具栏,将其添加到右侧区域
QToolBar* tb = new QToolBar(this);
addToolBar(Qt::RightToolBarArea,tb);
//设置工具栏停留的位置只能为最左侧和最右侧
tb->setAllowedAreas(Qt::LeftToolBarArea|Qt::RightToolBarArea);
//设置是否可以作为一个独立的窗口被拖拽
tb->setFloatable(false);
//设置是否可以移动工具栏
tb->setMovable(true);
//设置工具栏内容
QAction* openAction = new QAction("open",this);
QAction* newAction = new QAction("new",this);
tb->addAction(openAction);
tb->addSeparator();
tb->addAction(newAction);
//在工具栏中添加控件
QLabel* label = new QLabel("super little monster",this);
tb->addWidget(label);
}
toolbar
三、状态栏
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//创建和设置状态栏,因为一个窗口创建默认有状态栏,
//这里是直接把新创建的状态栏参数设置到已有的状态栏当中
QStatusBar* sb = statusBar();
setStatusBar(sb);
//状态栏的显示内容和时间
sb->showMessage("super_little_monster",2000);
//设置一个label设置到右下角永久显示,左下角永久显示就是用addWidget
QLabel* label = new QLabel("我在右下角",this);
sb->addPermanentWidget(label);
}
statusbar
四、浮动窗口
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//创建浮动窗口并将其设置在当前窗口中
QDockWidget* dw = new QDockWidget("浮动窗口",this);
addDockWidget(Qt::BottomDockWidgetArea,dw);
//设置浮动窗口四个位置都可停靠,还有四个选项,分别是上下左右:
//Qt::TopDockWidgetArea
//Qt::BottomDockWidgetArea
//Qt::LeftDockWidgetArea
//Qt::RightDockWidgetArea
dw->setAllowedAreas(Qt::AllDockWidgetAreas);
}
dockwidget
五、对话框
1、简介
通常是一个顶层窗口,出现在屏幕最上层,用于实现短期任务或者简洁的用户交互,分为模态对话框和非模态对话框
(1)模态对话框
显示后无法与父窗口进行交互的的对话框叫做模态对话框,一般用作消息显示,文件选择等,当模态对话框出现时,我们就不能操作父窗口了,例如word文档,当我们输入内容点击关闭时,弹出的对话框就是模态对话框,必须先对对话框进行交互才能进行下一步动作,不然父窗口是不能再编辑的
一般用QDialog::exec()函数调用,建立在栈区,因为该函数有阻塞作用,程序就会一直阻塞在这里不进行下一步
dialog
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//新建一个工具栏,将打开工具设置到工具栏中
QToolBar* tb = new QToolBar(this);
QAction* a = new QAction("打开");
tb->addAction(a);
//将点击打开按钮发送的信号与拉姆达表达式connect,实现弹出对话框效果
connect(a,&QAction::triggered,[=]()
{
QDialog dg(this);
dg.resize(300,400);
dg.exec();
//exec阻塞程序,在与对话框交互完成后程序继续执行,有点类似于stm32中的中断哈
});
}
(2)非模态对话框
非模态对话框显示后独立存在,可以同时与父窗口进行交互,一般建立在堆区,因为其不影响父窗口的特性,也就是无阻塞,如果建立在栈区往往会一闪而过
一般用QDialog::show()函数调用
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//新建一个工具栏,将打开工具设置到工具栏中
QToolBar* tb = new QToolBar(this);
QAction* a = new QAction("打开");
tb->addAction(a);
//将点击打开按钮发送的信号与拉姆达表达式connect,实现弹出对话框效果
connect(a,&QAction::triggered,[=](){
QDialog* dialog = new QDialog(this);
dialog->resize(300,400);
dialog->setAttribute(Qt::WA_DeleteOnClose);
//QT内部的方法,当关闭窗口时释放窗口内存
dialog->show();
//show不阻塞程序,所以我们要将dialog建在堆上
});
}
dialog_2
(3)混合属性对话框
混合属性对话框在生成和销毁上具有非模态对话框属性,在功能上具有模态对话框属性
使用QDialog::setModal(bool)函数来创建
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
QToolBar* tb = new QToolBar(this);
QAction* a = new QAction("打开");
tb->addAction(a);
connect(a,&QAction::triggered,[=](){
QDialog* dialog = new QDialog(this);
dialog->resize(300,400);
dialog->setAttribute(Qt::WA_DeleteOnClose);
dialog->setModal(true);//注意,与上方的程序相比我只添加了这一行代码
dialog->show();
});
}
dialog_3
今日分享到此结束~