Qt-Day04-学习笔记

总结前面的学习:

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();//显示窗口

Qt-Day04-学习笔记

  • 无窗口拖动,以及缩大缩小
    定义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);
}

Qt-Day04-学习笔记
参考文献

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
}

Qt-Day04-学习笔记
Qt-Day04-学习笔记
Qt-Day04-学习笔记
Qt-Day04-学习笔记

上一篇:Day04 Python运算符


下一篇:Vue-day04