目录
一、作业
要求:
设计一个窗口,窗口内有一名为open的按钮。点击open按钮,重新生成一个新窗口,并且open按钮名变为close,此时再点击按钮新窗口关闭,原先窗口保持不变。
实现:
1.创建新的窗口类
my_liuwindow.h
#ifndef MY_LIUWINDOW_H
#define MY_LIUWINDOW_H
#include <QMainWindow>
class My_liuWindow: public QMainWindow
{
Q_OBJECT;
public:
My_liuWindow(QWidget *parent = nullptr);
~My_liuWindow();
};
#endif // MY_LIUWINDOW_H
my_liuwindow.cpp
#include "my_liuwindow.h"
#include<QPushButton>
My_liuWindow::My_liuWindow(QWidget *parent):QMainWindow(parent)
{
setWindowTitle("My Custom Window");
this->resize(600,600);
QPushButton *btn = new QPushButton();
btn->resize(100,50);
btn->setParent(this);//设置按钮的父部件为当前窗口部件
btn->show();//show以顶层方式弹出窗口控件
btn->setText("关闭");
}
My_liuWindow::~My_liuWindow()
{
}
2. 主窗口中实现
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "my_liuwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
this->resize(600,600);//设置主窗口大小
QPushButton *btn = new QPushButton();//创建新按钮
btn->resize(100,50);//设置按钮大小
btn->setParent(this);//设置按钮的父部件为当前窗口部件
btn->show();//show以顶层方式弹出窗口控件
btn->setText("Open");//按钮命名
connect(btn,&QPushButton::clicked,this,&MainWindow::Openliuwindow);
//做信号和槽的连接
}
void MainWindow:: Openliuwindow()
{
My_liuWindow *SecondWindow = new My_liuWindow(this);//创建新窗口指针
SecondWindow->move(100,100);//移动新窗口显示位置,避免遮挡旧窗口
SecondWindow->show();//显示新窗口
QPushButton *btn = qobject_cast<QPushButton *>(sender());
//用于在槽函数中处理多个按钮或其他类型的信号源,
//以便能够区分是哪一个按钮或对象触发了槽函数。
btn->setText("close");//改名
disconnect(btn,&QPushButton::clicked,this,&MainWindow::Openliuwindow);
//断开原有的连接
connect(btn,&QPushButton::clicked,this,[=](){
//创立新连接
SecondWindow->close();
});
}
源码:
https://gitee.com/liu-wei-hao123/green_C/tree/master/03MyWindow
二、 窗口菜单设计
#include "mainwindow.h"
#include<QMenuBar>
#include<QToolBar>
#include<QPushButton>
#include<QStatusBar>
#include <QLabel>
#include <QDockWidget>
#include <QTextEdit>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
resize(600,400);
//菜单栏最多只能有一个
//菜单创建
QMenuBar *bar = menuBar();
//将菜单栏放入窗口中
setMenuBar(bar);
//创建菜单
QMenu *fileMenu = bar->addMenu("文件");
QMenu *editMenu = bar->addMenu("编辑");
//创建菜单项目
QAction * newAction = fileMenu->addAction("新建");
//添加分割线
fileMenu->addSeparator();
QAction * openAction = fileMenu->addAction("打开");
//工具栏可以有多个
QToolBar * toolBar = new QToolBar(this);
addToolBar(Qt::LeftToolBarArea,toolBar);
//后期设置 只允许 左右停靠
toolBar->setAllowedAreas(Qt::LeftToolBarArea|Qt::RightToolBarArea);
//设置浮动
toolBar->setFloatable(false);
//设置移动(总开关)
toolBar->setMovable(true);
//工具栏中可以设置内容
toolBar->addAction(newAction);
//添加分割线
toolBar->addSeparator();
toolBar->addAction(openAction);
//工具栏中添加控件
QPushButton * btn = new QPushButton("a",this);
toolBar->addWidget(btn);
//状态栏最多有一个
QStatusBar * stBar = statusBar();
//设置到窗口中
setStatusBar(stBar);
//放标签控件
QLabel * label = new QLabel("提示信息",this);
stBar->addWidget(label);
QLabel * label2 = new QLabel("右侧提示信息",this);
stBar->addPermanentWidget(label2);
//铆接部件 (浮动窗口) 可以有多个
QDockWidget * dockWidget = new QDockWidget("浮动",this);
addDockWidget(Qt::BottomDockWidgetArea,dockWidget);
//设置后期停靠区域,只允许上下
dockWidget->setAllowedAreas( Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea );
//设置中心部件 只能一个
QTextEdit * edit = new QTextEdit(this);
setCentralWidget(edit);
}
MainWindow::~MainWindow()
{
}
效果展示图
源码:
https://gitee.com/liu-wei-hao123/green_C/tree/master/04MainWindow
三、图片资源的导入
步骤:
1.将存放图片的文件夹复制到项目文件夹中
2.右击项目,新建文件,选择Qt->Qt Resource File,命名。
3.新建成功,显示该页面
4.点击Add Prefix,添加文件前缀名
5.点击Add Files,找到刚才放入项目中的图片文件夹,选中全部图片加入即可。
举例:
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//ui->actionnew->setIcon(QIcon("D:/word/功课/Qt学习/anniu/1.png"));
//添加Qt资源 “ : + 前缀名 + 文件名 ”
ui->actionnew->setIcon(QIcon(":/new/anniu/1.png"));
ui->actionopen->setIcon(QIcon(":/new/anniu/2.png"));
}
MainWindow::~MainWindow()
{
delete ui;
}
很明显,在UI界面创建的新建和打开以及被图片替换掉了。
源码:
https://gitee.com/liu-wei-hao123/green_C/tree/master/05_QtSource
四、 对话框
1.模拟对话框
(不可以对其他窗口进行操作)
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDialog>
#include <QDebug>
#include <QMessageBox>
#include <QColorDialog>
#include <QFileDialog>
#include <QFontDialog>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//点击新建按钮 弹出一个对话框
connect(ui->actionnew,&QAction::triggered,[=](){
//对话框 分类
//模态对话框 (不可以对其他窗口进行操作)
//模态创建 阻塞
QDialog dlg(this);
dlg.resize(200,100);
dlg.exec();
qDebug() << "模态对话框弹出了";
});
}
2. 非模态对话框
(可以对其他窗口进行操作)
//非模态对话框
QDialog * dlg2 = new QDialog (this);
dlg2->resize(200,100);
dlg2->show();
dlg2->setAttribute(Qt::WA_DeleteOnClose); //55号 属性
qDebug() << "非模态对话框弹出了";
3.错误对话框
QMessageBox::critical(this,"critical","错误");
4.信息对话框
QMessageBox::information(this,"info","信息");
5.提问对话框
//提问对话框
//参数1 父亲 参数2 标题 参数3 提示内容 参数4 按键类型 参数5 默认关联回车按键
if (QMessageBox::Save == QMessageBox::question(this,"ques","提问",QMessageBox::Save|QMessageBox::Cancel,QMessageBox::Cancel))
{
qDebug() << "选择的是保存";
}
else
{
qDebug() << "选择的是取消";
}
6.警告对话框
QMessageBox::warning(this,"warning","警告");
7. 其他标准对话框
7.1颜色对话框(获取颜色RGB值)
//颜色对话框
QColor color = QColorDialog::getColor(QColor(255,0,0));
qDebug() << "r = " << color.red()
<< " g = " << color.green()
<< " b = " << color.blue() ;
7.2文件对话框(过滤)
//文件对话框 参数 1 父亲 参数2 标题
参数3 默认打开路径 参数4 过滤文件格式
//返回值是 选取的路径
QString str = QFileDialog::getOpenFileName(this,"打开文
件","D:\\下载\\aaa","(*.txt)");
qDebug() << str;
7.3 字体对话框
//字体对话框
bool flag;
QFont font = QFontDialog::getFont(&flag,QFont("华文彩云",36));
qDebug() << "字体:" << font.family().toUtf8().data()
//.ToUtf8() 转为 QByteArray,.data() 转为 char*
<< " 字号 "<< font.pointSize()
<< " 是否加粗"<< font.bold()
<< " 是否倾斜"<<font.italic();
源码:
https://gitee.com/liu-wei-hao123/green_C/tree/master/06_QDialog
五、创建简单登录界面
源码:
https://gitee.com/liu-wei-hao123/green_C/tree/master/07_layout
推荐看视频:
登录界面https://www.bilibili.com/video/BV1g4411H78N?p=23&vd_source=0c3415ec4f238d01f925a8521c722882
六、控件
效果展示图
源码:
https://gitee.com/liu-wei-hao123/green_C/tree/master/08_Qt_control
推荐看视频(两个):
https://www.bilibili.com/video/BV1g4411H78N?p=24&vd_source=0c3415ec4f238d01f925a8521c722882
https://www.bilibili.com/video/BV1g4411H78N?p=25&vd_source=0c3415ec4f238d01f925a8521c722882
七、树控件(TreeWidget)
效果展示图
具体代码:
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//treeWidget树控件
//设置水平头
ui->treeWidget->setHeaderLabels(QStringList()<<"英雄"<<"英雄介绍");
QTreeWidgetItem * liItem = new QTreeWidgetItem(QStringList()<<"力量");
QTreeWidgetItem * liItem1 = new QTreeWidgetItem(QStringList()<<"敏捷");
QTreeWidgetItem * liItem2 = new QTreeWidgetItem(QStringList()<<"智力");
//加载顶层节点
ui->treeWidget->addTopLevelItem(liItem);
ui->treeWidget->addTopLevelItem(liItem1);
ui->treeWidget->addTopLevelItem(liItem2);
//追加子节点
QStringList heroL1;
heroL1<<"钢被🐖"<<"前排坦克,能在吸收伤害的同时造成可观的范围输出";
QTreeWidgetItem * l1 = new QTreeWidgetItem(heroL1);
liItem->addChild(l1);
QStringList heroL2;
heroL2<<"斯比克"<<"前排坦克,能在吸收伤害的同时反弹所受伤害的50%";
QTreeWidgetItem * l2 = new QTreeWidgetItem(heroL2);
liItem->addChild(l2);
QStringList heroM1;
heroM1<<"小丑🤡"<<"游走刺客,拥有伤害高可投掷的小丑炸弹和珍贵的稻草人保命技能";
QTreeWidgetItem * M1 = new QTreeWidgetItem(heroM1);
liItem1->addChild(M1);
QStringList heroM2;
heroM2<<"小丑皇🎃"<<"隐身刺客,拥有伤害高可投掷的小丑夺命连环手里剑和多重影分身";
QTreeWidgetItem * M2 = new QTreeWidgetItem(heroM2);
liItem1->addChild(M2);
QStringList heroZ1;
heroZ1<<"猪角量"<<"分析法师,能快速对当前战场情况进行分析并做出判断";
QTreeWidgetItem * Z1 = new QTreeWidgetItem(heroZ1);
liItem2->addChild(Z1);
QStringList heroZ2;
heroZ2<<"骤雨"<<"爆发法师,短时间内对当前区域造成大量冰锥穿刺";
QTreeWidgetItem * Z2 = new QTreeWidgetItem(heroZ2);
liItem2->addChild(Z2);
}
Widget::~Widget()
{
delete ui;
}
源码:
https://gitee.com/liu-wei-hao123/green_C/tree/master/09_TreeWidget
八、表格控件(TableWidget)
效果展示图
具体代码
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//TableWidget控件
//设置列数
ui->tableWidget->setColumnCount(3);
//设置水平表头
ui->tableWidget->setHorizontalHeaderLabels(QStringList()
<<"姓名"
<< "性别"
<< "年龄");
//设置行数
ui->tableWidget->setRowCount(5);
//设置正文
//ui->tableWidget->setItem(0,0, new QTableWidgetItem("亚瑟"));
QStringList nameList;
nameList<< "亚瑟"<< "赵云"<< "张飞"<< "关羽" << "花木兰";
QList<QString> sexList;
sexList << "男"<< "男"<< "男"<< "男"<< "女";
for(int i = 0 ; i < 5 ;i ++)
{
int col = 0;
ui->tableWidget->setItem(i,col++, new QTableWidgetItem(nameList[i]));
ui->tableWidget->setItem(i,col++, new QTableWidgetItem(sexList.at(i)));
//int 转 QString
ui->tableWidget->setItem(i,col++, new QTableWidgetItem( QString::number(i+18)));
}
}
Widget::~Widget()
{
delete ui;
}
源码:
https://gitee.com/liu-wei-hao123/green_C/tree/master/
九、其他常用控件
效果展示图
具体代码:
#include "widget.h"
#include "ui_widget.h"
#include<QMovie>
#include<QImage>
#include<QPixmap>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//栈控件使用
//设置默认定位 scrollArea
ui->stackedWidget->setCurrentIndex(0);
//scrollArea按钮
connect(ui->btn_scrollArea,&QPushButton::clicked,[=](){
ui->stackedWidget->setCurrentIndex(0);
});
//toolBox按钮
connect(ui->btn_ToolBox,&QPushButton::clicked,[=](){
ui->stackedWidget->setCurrentIndex(1);
});
//TabWidget按钮
connect(ui->btn_TabWidget,&QPushButton::clicked,[=](){
ui->stackedWidget->setCurrentIndex(2);
});
//下拉框
ui->comboBox->addItem("奔驰");
ui->comboBox->addItem("宝马");
ui->comboBox->addItem("拖拉机");
//点击按钮 选中拖拉机选项
connect(ui->btn_select,&QPushButton::clicked,[=](){
//ui->comboBox->setCurrentIndex(2);
ui->comboBox->setCurrentText("拖拉机");
});
ui->lbl_Image->setPixmap(QPixmap(":/anniu/1.png"));
//利用QLabel显示 gif动态图片
QMovie * movie = new QMovie(":/anniu/5.gif");
ui->lbl_movie->setMovie(movie);
//播放动图
movie->start();
}
Widget::~Widget()
{
delete ui;
}
源码:
https://gitee.com/liu-wei-hao123/green_C/tree/master/11_OthorControl
视频:
https://www.bilibili.com/video/BV1g4411H78N?p=28&vd_source=0c3415ec4f238d01f925a8521c722882
第二天的学习记录分享完毕,关注我,带你了解更多的编程知识。
看到这里,不妨点个攒,关注一下吧!
最后,谢谢你的观看!