总结前面的学习:
Qt: 我们可以理解为C++封装的一个库而已;
- Qt6 只有QML.(我们现在大部分都在widget,但是从6.0开始已经取消了widget,直接使用Quick)
Qt的控件(我们真正开发中,我们使用的是无窗口界面,因此需要去掉标题栏这一块)
- QWidget :所有用户界面对象的基类;
- QDialog: 对话框;
- QMainWindow: 提供菜单栏,工具栏,状态条的应用程序窗口;
模态对话框:
1> 主窗口被阻塞,不能进行点击,也不能进行拖动等一些操作;
2> exec之后的代码是不能进行运行的,必须要关闭模态窗口才能运行.
非模态对话框
1> 主界面不会被阻塞,可以进行点击,也能进行拖动等一些操作;
2> show之后的代码是能进行运行的,不需要关闭非模态窗口才能运行.
半模态对话框
1> 主界面还是被阻塞,不能进行点击,也不能进行拖动等任何操作;
2> show之后的代码还是能进行运行的,不需要关闭半模态窗口才能运行. - QLabel: 既可以显示文字,也可以显示图片;
- QPushButton: 它就是一个按钮.
Qt的布局
- 水平布局;
- 垂直布局;
- 栅格布局;
- 手动布局;
没有最好的,只有最合适的.
信号和槽的机制
- 一个信号可以连接多个信号或者槽;
- 槽是不能作为信号发送的;
- 多个信号可以连接一个槽;
- 信号和槽使用connect()函数进行连接:
connect(信号的发送者,发送的信号,信号的接收者,处理的信号);
// 发送信号者, 发送信号的方法, 接收者, 接收者的方法
//都是指针类型,需要取地址 - 父类调用子类的方法,我们是用函数;
- 子类传递给父类,我们是用信号和槽.
- 构造方法:就是当前这个类的入口方法.
注意:
- 创建项目的时候,项目名称一定要是英文;工程路径也一定要是英文.
了解Git:
Git是一款免费、开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。 Git是用于Linux内核开发的版本控制工具。与CVS、Subversion一类的集中式版本控制工具不同,它采用了分布式版本库的作法,不需要服务器端软件,就可以运作版本控制,使得源代码的发布和交流极其方便。Git的速度很快,这对于诸如Linux内核这样的大项目来说自然很重要。Git最为出色的是它的合并追踪(merge tracing)能力。
官网:https://git-scm.com/
了解SVN:
TortoiseSVN是Subversion版本控制系统的一个免费开源客户端,可以对文件版本进行统一管理和控制;文件保存在*版本库,您可以将文件恢复到过去的版本,并且可以通过检查历史知道数据做了哪些修改,谁做的修改。
官网:http://tortoisesvn.tigris.org/
1. 无窗口,窗口置顶,无窗口拖动,无窗口缩大缩小
- 设为无窗口,无窗口置顶
QWidget w;//实例化一个窗口
//QMainWindow w;
//QDialog w;
w.setWindowFlags(Qt::FramelessWindowHint); //设置为无窗口
w.setWindowFlags(Qt::WindowStaysOnTopHint | w.windowFlags()); //置顶窗口
//w.showFullScreen(); //全屏显示
//w.showNormal(); //推出全屏显示
//w.showMaximized(); //Qt最大化,显示函数
//w.showMinimized(); //Qt最小化,显示函数
//w.resize(500,500); //Qt固定尺寸显示函数
// w.setMaximumSize(600,800);//Qt设置最大尺寸的函数
// w.setMinimumSize(100,100);//Qt设置最小尺寸的函数
//在QDialog中添加,"最大化"和"最小化"按钮
//w.setWindowFlags(Qt::Dialog | Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint);
w.show();//显示窗口
- 无窗口拖动,以及缩大缩小
定义nativeEvent事件完成此功能,这是通过windows的api实现的.
...
protected:
bool nativeEvent(const QByteArray &eventType,void *message,long *result);
void mousePressEvent(QMouseEvent *e);
void mouseMoveEvent(QMouseEvent *e);
private:
int boundaryWidth;
QPoint clickPos;
...
#include "framelesswidget.h"
framelesswidget::framelesswidget(QWidget *parent)
: QWidget(parent)
{
boundaryWidth=4; //设置触发的resize的宽度
this->setWindowFlags(Qt::FramelessWindowHint); //设置为无边框窗口
this->setMinimumSize(45,45); //设置最小尺寸
this->setStyleSheet("background:orange"); //设置背景颜色
}
framelesswidget::~framelesswidget()
{
}
bool framelesswidget::nativeEvent(const QByteArray &eventType,void *message,long *result)
{
MSG* msg = (MSG*)message;
switch(msg->message)
{
case WM_NCHITTEST:
int xPos = GET_X_LPARAM(msg->lParam) - this->frameGeometry().x();
int yPos = GET_Y_LPARAM(msg->lParam) - this->frameGeometry().y();
if(xPos < boundaryWidth && yPos<boundaryWidth) //左上角
*result = HTTOPLEFT;
else if(xPos>=width() -boundaryWidth&&yPos<boundaryWidth) //右上角
*result = HTTOPRIGHT;
else if(xPos<boundaryWidth&&yPos>=height()-boundaryWidth) //左下角
*result = HTBOTTOMLEFT;
else if(xPos>=width()-boundaryWidth&&yPos>=height()-boundaryWidth) //右下角
*result = HTBOTTOMRIGHT;
else if(xPos<boundaryWidth) //左边
*result=HTLEFT;
else if(xPos>=width()-boundaryWidth) //右边
*result=HTRIGHT;
else if(yPos<boundaryWidth) //上边
*result=HTTOP;
else if(yPos>=height()-boundaryWidth) //下边
*result=HTBOTTOM;
else
return false; //其他部分不做处理,返回false,留给其他事件处理器处理
return true;
}
return false; //此处返回false,留给其他事件处理器处理
}
void framelesswidget::mousePressEvent(QMouseEvent *e)
{
if(e->button() == Qt::LeftButton)
clickPos=e->pos();
}
void framelesswidget::mouseMoveEvent(QMouseEvent *e)
{
if(e->buttons() & Qt::LeftButton)
move(e->pos() + pos() - clickPos);
}
2. 信号和槽
#include "MySignal.h"
#include "ui_MySignal.h"
#pragma execution_character_set("utf-8")
MySignal::MySignal(QWidget *parent) :
QWidget(parent),
ui(new Ui::MySignal)
{
ui->setupUi(this);
initUI();
initSignal();
}
MySignal::~MySignal()
{
delete ui;
delete p_SonSignal;
}
void MySignal::initUI()
{
ui->label->hide();//隐藏label
//初始化sonSignal,防止进行多次实例化
if(p_SonSignal == nullptr)
{
p_SonSignal = new SonSignal();
}
}
void MySignal::initSignal()
{
//---------------------- 信号和槽的简单例子 -----------------------------
//Qt4的写法:在label上显示文字
connect(ui->showBtn,SIGNAL(clicked()),this,SLOT(slot_showBtn_clicked()));
//Qt5的写法:在label上隐藏文字
connect(ui->hideBtn,&QPushButton::clicked,this,&MySignal::slot_hideBtn_clicked);
/*-------------------- 一个信号可以多个槽来进行接收 ----------------------*/
connect(ui->showBtn,SIGNAL(clicked()),this,SLOT(slot_showBtn_clicked1()));
connect(ui->hideBtn,&QPushButton::clicked,this,&MySignal::slot_hideBtn_clicked1);
connect(p_SonSignal,SIGNAL(getSonStrText(QString)),this,SLOT(slot_getSonStrText(QString)));
connect(p_SonSignal,SIGNAL(getSonStrText(QString)),this,SLOT(slot_getSonStrText1(QString)));
}
void MySignal::slot_getSonStrText(QString str)//接收
{
ui->label->setText(str);
}
void MySignal::slot_getSonStrText1(QString str)//接收
{
ui->label_2->setText(str);
}
void MySignal::slot_showBtn_clicked() //槽的显示按钮的点击事件
{
ui->label->setText("测试一下");
ui->label->show();//显示Label
p_SonSignal->setShowWindow(true);
}
void MySignal::slot_hideBtn_clicked() //槽的隐藏按钮的点击事件
{
ui->label->hide();//隐藏Label
}
void MySignal::slot_showBtn_clicked1() //槽的显示按钮的点击事件的第二个槽
{
ui->label->setText("Try to test");
ui->label->show();//显示Label
}
void MySignal::slot_hideBtn_clicked1() //槽的隐藏按钮的点击事件的第二个槽
{
ui->label->hide();//隐藏Label
}