QT学习1

Qt知识总结

Qt的基类

在这里插入图片描述
Qweight:最基础的窗口类
QMainWindows:包括菜单栏,工具栏,状态栏
QDialog:对话框

main函数详解

在这里插入图片描述
1.创建一个QWeight的helloword的程序,他会产生一个main函数
2.在这个main函数中,首先会先创建一个应用程序的对象,只会调用QWeight的show方法显示对应的窗口界面。
3.QApplication是维护Qt生命周期的一个对象,exec()他是一个消息处理的函数,当你点击最小化或者关闭窗口的时候就会触发。
4.窗口类HelloWidget的构造函数中存在一个窗口的指针,如果在创建对象的时候没有进行声明,那么他就是一个顶级窗口。

pro文件的解析

在这里插入图片描述
1.QT += core gui 引入qt的core和gui的模块
2.greatethan 当版本高于4时需要额外引入widgets模块
3.target 可执行文件的名字
4.templan = app 表示生成的是一个可执行的程序,exe

QPushbutton

在这里插入图片描述
在这里插入图片描述

1.在main函数中创建一个button的对象
2.之后设置他的父窗口,如果没有设置,他会以顶层窗口的形式出现
3.之后可以通过move来设置他在父窗口中的位置

不能将所有的子窗口都添加在main函数中,这样会显得main函数特别的臃肿。
所以需要将他加入到对应的窗口类中。
在这里插入图片描述
添加到构造函数中,这个时候需要使用new来分配内存,不能直接声明,因为这样在构造函数结束以后他会进行内存的回收。这里new分配内存以后并不需要进行回收,因为父对象在回收以后他的析构函数会对子对象进行回收。

信号槽

在这里插入图片描述
点击按钮关闭窗口,通过connect来连接信号和槽
参数需要传递信号和槽的函数指针,当信号触发的时候就会回调槽的方法。

自定义信号和槽

在这里插入图片描述
新建一个teacher类,在signals中定义信号方法,当这个方法调用就会触发学生类中的槽函数
在这里插入图片描述
所以学生类中需要对槽函数进行实现
在这里插入图片描述
之后在父窗口中的构造函数创建这两个对象,之后可以通过connect连接信号槽,这样只要父窗口类的teacher对象调用了hug方法,那么student的对象的freeT方法就会回调。
小知识:当发生重载时,函数指针会有多个,这个时候需要使用static-cast强制转换让编译器根据参数去选择
在这里插入图片描述

信号槽的拓展

在这里插入图片描述

定时器QTimer

在这里插入图片描述
定时器常用api
简单说定时器就是你设置一个时间,当超过这个时间的时候,定时器就会一直发送timeout的信号

在这里插入图片描述
给这个信号关联一个槽函数,就可以处理超时事件了。

在这里插入图片描述
1.首先设置QTimer的时间间隔单位,设置成毫秒。
2.之后将QTimer的timeout信号和槽绑定。当QTimer启动之后他就一直发送信号
3.可以在槽中对信号进行处理。

对话框QMessageBox

QMessageBox 对话框类是 QDialog 类的子类,通过这个类可以显示一些简单的提示框,用于展示警告、错误、问题等信息。关于这个类我们只需要掌握一些静态方法的使用就可以了。

// 显示一个模态对话框, 将参数 text 的信息展示到窗口中
[static] void QMessageBox::about(QWidget *parent, const QString &title, const QString &text);

/*
参数:
- parent: 对话框窗口的父窗口
- title: 对话框窗口的标题
- text: 对话框窗口中显示的提示信息
- buttons: 对话框窗口中显示的按钮(一个或多个)
- defaultButton
    1. defaultButton指定按下Enter键时使用的按钮。
    2. defaultButton必须引用在参数 buttons 中给定的按钮。
    3. 如果defaultButton是QMessageBox::NoButton, QMessageBox会自动选择一个合适的默认值。
*/
// 显示一个信息模态对话框
[static] QMessageBox::StandardButton QMessageBox::information(
           QWidget *parent, const QString &title, 
           const QString &text, 
           QMessageBox::StandardButtons buttons = Ok,
           QMessageBox::StandardButton defaultButton = NoButton);

// 显示一个错误模态对话框
[static] QMessageBox::StandardButton QMessageBox::critical(
           QWidget *parent, const QString &title, 
           const QString &text, 
           QMessageBox::StandardButtons buttons = Ok,
           QMessageBox::StandardButton defaultButton = NoButton);

// 显示一个问题模态对话框
[static] QMessageBox::StandardButton QMessageBox::question(
           QWidget *parent, const QString &title, 
           const QString &text, 
           QMessageBox::StandardButtons buttons = StandardButtons(Yes | No), 
           QMessageBox::StandardButton defaultButton = NoButton);

// 显示一个警告模态对话框
[static] QMessageBox::StandardButton QMessageBox::warning(
           QWidget *parent, const QString &title, 
           const QString &text, 
           QMessageBox::StandardButtons buttons = Ok,
           QMessageBox::StandardButton defaultButton = NoButton);

代码来源链接: https://subingwen.cn/qt/qt-base-window/#3-1-QMessageBox


使用代码:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    QPushButton *btn = new QPushButton("按钮",this);
    btn->move(40,60);
    connect(btn, &QPushButton::clicked,this, [=](){
        QMessageBox::about(this,"about","这是一个简单的提示框");
        QMessageBox::critical(this,"critical","这是一个错误提示框");
        int ret = QMessageBox::question(this,"question","是否选择保存?",QMessageBox::Save, QMessageBox::Cancel);
        if(ret == QMessageBox::Save){
            QMessageBox::information(this, "information", "恭喜你保存成功了, o(* ̄︶ ̄*)o!!!");
        }
        else if(ret == QMessageBox::Cancel){
            QMessageBox::warning(this,"warning","你放弃了保存!!");
        }
        qDebug() << "按钮点击" << endl;
    });

}

MainWindow::~MainWindow()
{
    delete ui;
}

这里遇到了一个问题,就是当ui->setupUi(this)放在按钮声明之后的时候无法点击按钮,这是因为他设置了一个顶层的控件,这个控件覆盖住了button,导致他无法进行点击。详细可以查看:
https://blog.csdn.net/WQ_1996/article/details/78187280

QFileDialog

QFileDialog 对话框类是 QDialog 类的子类,通过这个类可以选择要打开 / 保存的文件或者目录。关于这个类我们只需要掌握一些静态方法的使用就可以了。

/*
通用参数:
  - parent: 当前对话框窗口的父对象也就是父窗口
  - caption: 当前对话框窗口的标题
  - dir: 当前对话框窗口打开的默认目录
  - options: 当前对话框窗口的一些可选项,枚举类型, 一般不需要进行设置, 使用默认值即可
  - filter: 过滤器, 在对话框中只显示满足条件的文件, 可以指定多个过滤器, 使用 ;; 分隔
    - 样式举例: 
	- Images (*.png *.jpg)
	- Images (*.png *.jpg);;Text files (*.txt)
  - selectedFilter: 如果指定了多个过滤器, 通过该参数指定默认使用哪一个, 不指定默认使用第一个过滤器
*/
// 打开一个目录, 得到这个目录的绝对路径
[static] QString QFileDialog::getExistingDirectory(
                  QWidget *parent = nullptr, 
                  const QString &caption = QString(), 
                  const QString &dir = QString(), 
                  QFileDialog::Options options = ShowDirsOnly);

// 打开一个文件, 得到这个文件的绝对路径
[static] QString QFileDialog::getOpenFileName(
    	          QWidget *parent = nullptr, 
    		  const QString &caption = QString(), 
                  const QString &dir = QString(), 
                  const QString &filter = QString(), 
                  QString *selectedFilter = nullptr, 
                  QFileDialog::Options options = Options());

// 打开多个文件, 得到这多个文件的绝对路径
[static] QStringList QFileDialog::getOpenFileNames(
    	          QWidget *parent = nullptr, 
                  const QString &caption = QString(), 
                  const QString &dir = QString(), 
                  const QString &filter = QString(), 
                  QString *selectedFilter = nullptr, 
                  QFileDialog::Options options = Options());

// 打开一个目录, 使用这个目录来保存指定的文件
[static] QString QFileDialog::getSaveFileName(
    		  QWidget *parent = nullptr, 
                  const QString &caption = QString(), 
                  const QString &dir = QString(), 
                  const QString &filter = QString(), 
                  QString *selectedFilter = nullptr, 
                  QFileDialog::Options options = Options());


代码来源链接: https://subingwen.cn/qt/qt-base-window/#3-2-QFileDialog

使用案例:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QPushButton *btn = new QPushButton("按钮", this);
    btn->move(40,60);
    connect(btn, &QPushButton::clicked, this, [=](){

        //显示一个文件对话框
        QString path = QFileDialog::getExistingDirectory(this, "打开目录", "e:\\work");

        QMessageBox::information(this,"打开目录","选择的目录是"+path);

    });

}

MainWindow::~MainWindow()
{
    delete ui;
}

打开一个文件对话框,选择文件夹以后返回对应的绝对路径。

选择一个文件

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QPushButton *btn = new QPushButton("按钮", this);
    btn->move(40,60);
    connect(btn, &QPushButton::clicked, this, [=](){

        //显示一个文件对话框.选择文件
        QString arg("Text files (*.txt)");
        QString path = QFileDialog::getOpenFileName(
                  this, "Open File", "e:\\temp",
                  "Images (*.png *.jpg);;Text files (*.txt)", &arg);

        QMessageBox::information(this,"打开目录","选择的目录是"+path);

    });




}

MainWindow::~MainWindow()
{
    delete ui;
}

QInputDialog

QInputDialog 类是 QDialog 的子类,通过这个类我们可以得到一个输入对话框窗口,根据实际需求我们可以在这个输入窗口中输入整形 , 浮点型 , 字符串类型的数据,并且还可以显示下拉菜单供使用者选择。
和前边介绍的对话框类一样,我们只需要调用这个类的静态成员函数就可以得到想要的窗口了。

简单使用:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QPushButton *btn = new QPushButton("按钮", this);
    btn->move(40,60);
    connect(btn, &QPushButton::clicked, this, [=](){

        int age = QInputDialog::getInt(this, "年龄", "当前年龄", 10, 1, 100, 2);

        QMessageBox::information(this,"年龄","年龄:"+ QString::number(age));

    });




}

MainWindow::~MainWindow()
{
    delete ui;
}

下拉列表的使用:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QPushButton *btn = new QPushButton("按钮", this);
    btn->move(40,60);
    connect(btn, &QPushButton::clicked, this, [=](){

        QStringList items;
        items << "苹果" << "橙子" << "橘子" << "葡萄" << "香蕉" << "哈密瓜";

        QString item = QInputDialog::getItem(this,"请选择你喜欢的水果", "你最喜欢的水果:", items, 0, false);

        QMessageBox::information(this,"水果","水果:"+ item);

    });




}

MainWindow::~MainWindow()
{
    delete ui;
}

进度条对话框QProgressDialog

QProgressDialog 类是 QDialog 的子类,通过这个类我们可以得到一个带进度条的对话框窗口,这种类型的对话框窗口一般常用于文件拷贝、数据传输等实时交互的场景中。

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QPushButton *btn = new QPushButton("按钮", this);
    btn->move(40,60);

    // 1. 创建进度条对话框窗口对象
    QProgressDialog *progress = new QProgressDialog(
                "正在拷贝数据...", "取消拷贝", 0, 100, this);
    // 2. 初始化并显示进度条窗口
    progress->setWindowTitle("请稍后");
    progress->setWindowModality(Qt::WindowModal);
    progress->show();

    // 3. 更新进度条
    static int value = 0;

    QTimer *t = new QTimer;
    connect(t, &QTimer::timeout, this, [=](){
        value++;
        progress->setValue(value);
        if(value >= 100){
            t->stop();
            delete progress;
            delete t;
        }
    });

    connect(progress, &QProgressDialog::canceled, this, [=](){
        t->stop();
        value = 0;
        delete progress;
        delete t;
    });

    t->start(50);

    connect(btn, &QPushButton::clicked, this, [=](){

        QStringList items;
        items << "苹果" << "橙子" << "橘子" << "葡萄" << "香蕉" << "哈密瓜";

        QString item = QInputDialog::getItem(this,"请选择你喜欢的水果", "你最喜欢的水果:", items, 0, false);

        QMessageBox::information(this,"水果","水果:"+ item);

    });
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值