基本介绍

main.ccp简介image.png

01_FirstProject文件

  1. // Qt包含的模块core和gui
  2. QT += core gui
  3. // 版本大于4时包含widget
  4. greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
  5. // 目标 生成的.exe程序名称
  6. TARGET = 01_FirstProject
  7. // 模板 应用程序模板 Application
  8. TEMPLATE = app
  9. //
  10. DEFINES += QT_DEPRECATED_WARNINGS
  11. // 源文件 一般自动生成的
  12. SOURCES += \
  13. main.cpp \
  14. mywidget.cpp
  15. // 头文件
  16. HEADERS += \
  17. mywidget.h

使用和快捷键

image.png

mywidget.cpp中按钮和窗口的设置

  1. #include "mywidget.h"
  2. #include <QPushButton> // 按钮文件的头文件
  3. myWidget::myWidget(QWidget *parent)
  4. : QWidget(parent)
  5. {
  6. // 创建一个按钮
  7. QPushButton * btn = new QPushButton;
  8. // 显示窗口 默认在顶层窗口弹出
  9. // btn->show();
  10. // 让btn对象依赖在myWidget窗口中
  11. btn->setParent(this);
  12. // 显示文本
  13. btn->setText("第一个按钮");
  14. // 创建第二个按钮 按照你的控件大小创建窗口
  15. QPushButton * btn2 = new QPushButton("第二个按钮", this);
  16. // 移动btn按钮
  17. btn2->move(20, 20);
  18. // 重组btn2按钮大小
  19. btn2->resize(50, 20);
  20. // 重置窗口大小
  21. resize(600, 400);
  22. // 设置固定窗口大小
  23. setFixedSize(600, 400);
  24. // 设置窗口标题
  25. setWindowTitle("My deng");
  26. }

对象树基本概念

image.png

mypushbutton.h文件

  1. #ifndef MYPUSHBUTTON_H
  2. #define MYPUSHBUTTON_H
  3. // 引入QPushButton
  4. #include <QPushButton>
  5. class MyPushButton : public QPushButton
  6. {
  7. Q_OBJECT
  8. public:
  9. explicit MyPushButton(QWidget *parent = nullptr);
  10. // MyPushButton();
  11. ~MyPushButton();
  12. signals:
  13. public slots:
  14. };
  15. #endif // MYPUSHBUTTON_H

mypushbutton.ccp文件

  1. #include "mypushbutton.h"
  2. #include <QDebug>
  3. MyPushButton::MyPushButton(QWidget *parent) : QPushButton(parent)
  4. {
  5. qDebug() << "我的按钮类构造调用";
  6. }
  7. MyPushButton::~MyPushButton()
  8. {
  9. qDebug() << "我的按钮类析构";
  10. }

mywidget.cpp文件

  1. #include "mywidget.h"
  2. #include <QPushButton> // 按钮文件的头文件
  3. #include "mypushbutton.h"
  4. #include <QDebug>
  5. myWidget::myWidget(QWidget *parent)
  6. : QWidget(parent)
  7. {
  8. // 创建一个按钮
  9. QPushButton * btn = new QPushButton;
  10. // 显示窗口 默认在顶层窗口弹出
  11. // btn->show();
  12. // 让btn对象依赖在myWidget窗口中
  13. btn->setParent(this);
  14. // 显示文本
  15. btn->setText("第一个按钮");
  16. // 创建第二个按钮 按照你的控件大小创建窗口
  17. QPushButton * btn2 = new QPushButton("第二个按钮", this);
  18. // 移动btn2按钮
  19. btn2->move(20, 20);
  20. // 重组btn2按钮大小
  21. btn2->resize(100, 20);
  22. // 重置窗口大小
  23. resize(600, 400);
  24. // 设置固定窗口大小
  25. setFixedSize(600, 400);
  26. // 设置窗口标题
  27. setWindowTitle("My deng");
  28. // 创建一个自己的按钮对象
  29. MyPushButton * myBtn = new MyPushButton;
  30. myBtn->setText("我自己的按钮");
  31. myBtn->move(300, 300);
  32. // 设置到对象树中
  33. myBtn->setParent(this);
  34. }
  35. myWidget::~myWidget()
  36. {
  37. // 析构
  38. qDebug() << "myWidget的析构调用";
  39. }

对象树小结
当创建的对象在堆区的时候,如果指定的父亲是QObject派生下来的类或者QObject子类派生下来的类,可以不用管理释放的操作,将对象放入到对象树中。
一定程度上简化了内存回收机制

信号和槽机制

连接的函数:connect(参数1,参数2,参数3,参数4);
参数:
参数1:信号的发送者
参数2:发送的信号
参数3:信号的接收者
参数4:处理

  1. #include "mywidget.h"
  2. #include <QPushButton> // 按钮文件的头文件
  3. #include "mypushbutton.h"
  4. #include <QDebug>
  5. // 命名规范
  6. // 类名 首字母大写, 单词和单纯之间首字母大写
  7. // 函数名 变量名称 首字母小写,单词和单词之间首字母大写
  8. myWidget::myWidget(QWidget *parent)
  9. : QWidget(parent)
  10. {
  11. // 创建一个按钮
  12. QPushButton * btn = new QPushButton;
  13. // 显示窗口 默认在顶层窗口弹出
  14. // btn->show();
  15. // 让btn对象依赖在myWidget窗口中
  16. btn->setParent(this);
  17. // 显示文本
  18. btn->setText("第一个按钮");
  19. // 创建第二个按钮 按照你的控件大小创建窗口
  20. QPushButton * btn2 = new QPushButton("第二个按钮", this);
  21. // 移动btn2按钮
  22. btn2->move(20, 20);
  23. // 重组btn2按钮大小
  24. btn2->resize(100, 20);
  25. // 重置窗口大小
  26. resize(600, 400);
  27. // 设置固定窗口大小
  28. setFixedSize(600, 400);
  29. // 设置窗口标题
  30. setWindowTitle("My deng");
  31. // 创建一个自己的按钮对象
  32. MyPushButton * myBtn = new MyPushButton;
  33. myBtn->setText("我自己的按钮");
  34. myBtn->move(300, 300);
  35. // 设置到对象树中
  36. myBtn->setParent(this);
  37. // 信号和槽
  38. // 需求 点击我的按钮 关闭窗口
  39. // 参数1 信号的发送者; 参数2 发送的信号(函数的地址); 参数3 信号的接收者;参数4 处理的槽函数
  40. connect(myBtn, &QPushButton::clicked, this, &QWidget::close);
  41. //或使用下面这个
  42. //connect(myBtn, &MyPushButton::clicked, this, &myWidget::close);
  43. }
  44. myWidget::~myWidget()
  45. {
  46. // 析构
  47. qDebug() << "myWidget的析构调用";
  48. }

自定义的信号和槽

自定义信号
teacher.h文件

  1. #ifndef TEACHER_H
  2. #define TEACHER_H
  3. #include <QObject>
  4. class Teacher : public QObject
  5. {
  6. Q_OBJECT
  7. public:
  8. explicit Teacher(QObject *parent = nullptr);
  9. signals:
  10. // 自定义信号写到signals下
  11. // 返回值是void,需要声明,不需要实现
  12. // 可以有参数,可以重载
  13. void hungry();
  14. public slots:
  15. };
  16. #endif // TEACHER_H

自定义槽函数
student.h文件

  1. #ifndef STUDENT_H
  2. #define STUDENT_H
  3. #include <QObject>
  4. class Student : public QObject
  5. {
  6. Q_OBJECT
  7. public:
  8. explicit Student(QObject *parent = nullptr);
  9. signals:
  10. public slots:
  11. // 早期QT版本槽函数必须要写到public slots,高级版本可用写到public或者全局下
  12. // 返回值是void,需要声明,也需要实现
  13. // 可以有参数,可以发生重载
  14. void treat();
  15. };
  16. #endif // STUDENT_H

student.ccp文件

  1. #include "student.h"
  2. #include <QDebug>
  3. Student::Student(QObject *parent) : QObject(parent)
  4. {
  5. }
  6. void Student::treat()
  7. {
  8. qDebug() << "请老师吃饭";
  9. }

窗口文件
widget.h文件

  1. #ifndef WIDGET_H
  2. #define WIDGET_H
  3. #include <QWidget>
  4. #include "teacher.h"
  5. #include "student.h"
  6. namespace Ui {
  7. class Widget;
  8. }
  9. class Widget : public QWidget
  10. {
  11. Q_OBJECT
  12. public:
  13. explicit Widget(QWidget *parent = 0);
  14. ~Widget();
  15. private:
  16. Ui::Widget *ui;
  17. // 声明指针
  18. Teacher * zt;
  19. Student * st;
  20. // 方法
  21. void classIsOver();
  22. };
  23. #endif // WIDGET_H

widget.ccp文件

  1. #include "widget.h"
  2. #include "ui_widget.h"
  3. // Teacher 类 老师类
  4. // Student 类 学生类
  5. // 下课后,老师会触发一个信号,饿了,学生相应
  6. Widget::Widget(QWidget *parent) :
  7. QWidget(parent),
  8. ui(new Ui::Widget)
  9. {
  10. ui->setupUi(this);
  11. // 创建一个老师的对象
  12. this->zt = new Teacher(this);
  13. // 创建一个学生对象
  14. this->st = new Student(this);
  15. // 老师饿了 学生请客的连接
  16. connect(zt, &Teacher::hungry, st, &Student::treat);
  17. // 调用下课函数
  18. classIsOver();
  19. }
  20. // 实现方法
  21. void Widget::classIsOver()
  22. {
  23. // 下课函数, 调用后 触发老师饿了的信号
  24. // emit 触发自定义的信号
  25. emit zt->hungry();
  26. }
  27. Widget::~Widget()
  28. {
  29. delete ui;
  30. }

image.png

自定义信号和槽发生重载的解决

teacher.h文件

  1. #ifndef TEACHER_H
  2. #define TEACHER_H
  3. #include <QObject>
  4. class Teacher : public QObject
  5. {
  6. Q_OBJECT
  7. public:
  8. explicit Teacher(QObject *parent = nullptr);
  9. signals:
  10. // 自定义信号写到signals下
  11. // 返回值是void,需要声明,不需要实现
  12. // 可以有参数,可以重载
  13. void hungry();
  14. // 有两个hungry方法
  15. void hungry(QString foodName);
  16. public slots:
  17. };
  18. #endif // TEACHER_H

student.h文件

  1. #ifndef STUDENT_H
  2. #define STUDENT_H
  3. #include <QObject>
  4. class Student : public QObject
  5. {
  6. Q_OBJECT
  7. public:
  8. explicit Student(QObject *parent = nullptr);
  9. signals:
  10. public slots:
  11. // 早期QT版本槽函数必须要写到public slots,高级版本可用写到public或者全局下
  12. // 返回值是void,需要声明,也需要实现
  13. // 可以有参数,可以发生重载
  14. void treat();
  15. // 有两个treat方法
  16. void treat(QString foodName);
  17. };
  18. #endif // STUDENT_H

student.cpp文件

  1. #include "student.h"
  2. #include <QDebug>
  3. Student::Student(QObject *parent) : QObject(parent)
  4. {
  5. }
  6. void Student::treat()
  7. {
  8. qDebug() << "请老师吃饭";
  9. }
  10. // 加作用域
  11. void Student::treat(QString foodName)
  12. {
  13. // QString -> chat * 先转成QByteArray (.toUtf8() ) 在转char *()
  14. qDebug() << "请老师吃饭,老师要吃" << foodName.toUtf8().data();
  15. }

widget.cpp文件

  1. #include "widget.h"
  2. #include "ui_widget.h"
  3. // Teacher 类 老师类
  4. // Student 类 学生类
  5. // 下课后,老师会触发一个信号,饿了,学生相应
  6. Widget::Widget(QWidget *parent) :
  7. QWidget(parent),
  8. ui(new Ui::Widget)
  9. {
  10. ui->setupUi(this);
  11. // 创建一个老师的对象
  12. this->zt = new Teacher(this);
  13. // 创建一个学生对象
  14. this->st = new Student(this);
  15. // // 老师饿了 学生请客的连接
  16. // connect(zt, &Teacher::hungry, st, &Student::treat);
  17. // // 调用下课函数
  18. // classIsOver();
  19. //解决重载问题
  20. // 连接带参数的信号和槽
  21. // 指针->地址
  22. // 函数指针 -> 函数地址
  23. // Teacher作用域下的teacherSignal函数指针
  24. void(Teacher:: *teacherSignal)(QString) = &Teacher::hungry;
  25. void(Student:: *studentSlot)(QString) = &Student::treat;
  26. connect(zt, teacherSignal, st, studentSlot);
  27. classIsOver();
  28. }
  29. // 实现方法
  30. void Widget::classIsOver()
  31. {
  32. // 下课函数, 调用后 触发老师饿了的信号
  33. // emit 触发自定义的信号
  34. //emit zt->hungry();
  35. emit zt->hungry("宫保鸡丁");
  36. }
  37. Widget::~Widget()
  38. {
  39. delete ui;
  40. }

信号和信号的连接&断开&Qt4版本槽连接

  1. #include "widget.h"
  2. #include "ui_widget.h"
  3. #include <QPushButton>
  4. // Teacher 类 老师类
  5. // Student 类 学生类
  6. // 下课后,老师会触发一个信号,饿了,学生相应
  7. Widget::Widget(QWidget *parent) :
  8. QWidget(parent),
  9. ui(new Ui::Widget)
  10. {
  11. ui->setupUi(this);
  12. // 创建一个老师的对象
  13. this->zt = new Teacher(this);
  14. // 创建一个学生对象
  15. this->st = new Student(this);
  16. // // 老师饿了 学生请客的连接
  17. // connect(zt, &Teacher::hungry, st, &Student::treat);
  18. // // 调用下课函数
  19. // classIsOver();
  20. // 连接带参数的信号和槽
  21. // 指针->地址
  22. // 函数指针 -> 函数地址
  23. // Teacher作用域下的teacherSignal函数指针
  24. void(Teacher:: *teacherSignal)(QString) = &Teacher::hungry;
  25. void(Student:: *studentSlot)(QString) = &Student::treat;
  26. connect(zt, teacherSignal, st, studentSlot);
  27. classIsOver();
  28. // 点击一个下课的按钮,再触发下课
  29. QPushButton * btn = new QPushButton("下课", this);
  30. this->resize(600, 400);
  31. // 点击按钮,触发下课
  32. connect(btn, &QPushButton::clicked, this, &Widget::classIsOver);
  33. // 无参信号和槽连接
  34. void(Teacher:: *teacherSignal2)(void) = &Teacher::hungry;
  35. void(Student:: *studentSlot2)(void) = &Student::treat;
  36. connect(zt, teacherSignal2, st, studentSlot2);
  37. // 信号和信号连接
  38. connect(btn, &QPushButton::clicked, zt, teacherSignal2);
  39. // 断开信号
  40. disconnect(zt, teacherSignal2, st, studentSlot2);
  41. // 拓展
  42. // 1.信号是可以连接信号
  43. // 2.一个信号可以连接多个槽函数
  44. // 3.多个信号可以连接同一个槽函数
  45. // 4.信号和槽函数的参数必须类型一一对应
  46. // 5.信号的参数个数可以多与槽参数个数
  47. //Qt4版本以前的信号和槽的连接方式
  48. // 利用Qt4信号槽连接无参版本
  49. connect(zt, SIGNAL(hungry()), st, SLOT(treat()));
  50. // Qt4版本的优点:参数直观; 缺点:类型不做检测
  51. }
  52. // 实现方法
  53. void Widget::classIsOver()
  54. {
  55. // 下课函数, 调用后 触发老师饿了的信号
  56. // emit 触发自定义的信号
  57. //emit zt->hungry();
  58. emit zt->hungry("宫保鸡丁");
  59. }
  60. Widget::~Widget()
  61. {
  62. delete ui;
  63. }

QMainWindow

  1. #include "mainwindow.h"
  2. #include <QMenuBar>
  3. #include <QToolBar>
  4. #include <QDebug>
  5. #include <QPushButton>
  6. #include <QStatusBar>
  7. #include <QLabel>
  8. #include <QDockWidget>
  9. #include <QTextEdit>
  10. MainWindow::MainWindow(QWidget *parent)
  11. : QMainWindow(parent)
  12. {
  13. // 重置窗口大小
  14. resize(600, 400);
  15. // 菜单栏最多只能有一个
  16. // 菜单栏创建
  17. QMenuBar * bar = menuBar();
  18. // 将栏放入窗口中
  19. setMenuBar(bar);
  20. // 创建菜单 (有返回值QMenu)
  21. QMenu * fileMenu = bar->addMenu("文件");
  22. QMenu * editMenu = bar->addMenu("编辑");
  23. // 创建菜单项
  24. fileMenu->addAction("新建");
  25. // 添加分隔线
  26. fileMenu->addSeparator();
  27. fileMenu->addAction("打开");
  28. // 工具栏,可以有多个
  29. QToolBar * toolBar = new QToolBar(this);
  30. // 添加到视图上
  31. addToolBar(Qt::RightToolBarArea, toolBar);
  32. // 只允许左右停靠
  33. toolBar->setAllowedAreas(Qt::LeftToolBarArea | Qt::RightToolBarArea);
  34. // 设置浮动操作
  35. toolBar->setFloatable(false);
  36. // 设置移动 (相当于总开关)
  37. toolBar->setMovable(false);
  38. // 工具栏中可以设置内容 将菜单栏中的新建和打开放到这
  39. toolBar->addAction(newAction);
  40. // 添加分割线
  41. toolBar->addSeparator();
  42. toolBar->addAction(openAction);
  43. // 工具栏中添加一些控件
  44. QPushButton * btn = new QPushButton("AA", this);
  45. toolBar->addWidget(btn);
  46. // 状态栏 最多也只能有一个
  47. QStatusBar * stBar = statusBar();
  48. // 设置到窗口中
  49. setStatusBar(stBar);
  50. // 放标签控件
  51. QLabel * label = new QLabel("提示的信息", this);
  52. stBar->addWidget(label);
  53. QLabel * label2 = new QLabel("右侧提示信息", this);
  54. stBar->addPermanentWidget(label2);
  55. // 铆接部件 (浮动窗口)
  56. QDockWidget * dockWidget = new QDockWidget("浮动", this);
  57. // 设置区域
  58. addDockWidget(Qt::BottomDockWidgetArea, dockWidget);
  59. // 设置中心部件 只能一个
  60. dockWidget->setAllowedAreas(Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea);
  61. // 设置中心部件编辑 只能有一个值
  62. QTextEdit * edit = new QTextEdit(this);
  63. setCentralWidget(edit);
  64. }
  65. MainWindow::~MainWindow()
  66. {
  67. }

资源文件添加

  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. //#include <QIcon>
  4. MainWindow::MainWindow(QWidget *parent) :
  5. QMainWindow(parent),
  6. ui(new Ui::MainWindow)
  7. {
  8. ui->setupUi(this);
  9. // 使用添加Qt资源 ": + 前缀名 + 文件名"
  10. ui->actionnew->setIcon(QIcon(":/Image/20191016140642.jpg"));
  11. ui->actionopen->setIcon(QIcon(":/Image/1-15052216143c40-lp.jpg"));
  12. }
  13. MainWindow::~MainWindow()
  14. {
  15. delete ui;
  16. }

对话框QDialog

  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. #include <QDialog>
  4. #include <QDebug>
  5. MainWindow::MainWindow(QWidget *parent) :
  6. QMainWindow(parent),
  7. ui(new Ui::MainWindow)
  8. {
  9. ui->setupUi(this);
  10. // 点击新建按钮 弹出一个对话框
  11. connect(ui->actionnew, &QAction::triggered, [=](){
  12. // 对话框分类
  13. // 模态对话框(不可以对其他窗口进行操作); 非模块对话框(可以对其他窗口进行操作)
  14. // 模态创建
  15. QDialog dlg(this);
  16. dlg.resize(200, 100);
  17. dlg.exec();
  18. qDebug() << "模态对话框弹出了";
  19. // 非模态对话框
  20. QDialog * dlg2 = new QDialog(this);
  21. dlg2->resize(200, 100);
  22. dlg2->show();
  23. // 关闭窗口后就释放内存,防止内存泄漏
  24. dlg2->setAttribute(Qt::WA_DeleteOnClose); // 55号属性
  25. qDebug() << "非模态对话框弹出了";
  26. });
  27. }
  28. MainWindow::~MainWindow()
  29. {
  30. delete ui;
  31. }

消息对话框

  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. #include <QDebug>
  4. #include <QMessageBox>
  5. MainWindow::MainWindow(QWidget *parent) :
  6. QMainWindow(parent),
  7. ui(new Ui::MainWindow)
  8. {
  9. ui->setupUi(this);
  10. // 点击新建按钮 弹出一个对话框
  11. connect(ui->actionnew, &QAction::triggered, [=](){
  12. // 消息对话框 参数:父亲,标题,内容
  13. // 错误对话框
  14. //QMessageBox::Critical(this, "critical", "错误");
  15. // 信息对话框
  16. //QMessageBox::information(this, "info", "信息");
  17. // 提问对话框 参数1:父亲,参数2:标题,参数3:内容, 参数4:按钮类型(默认值为yes,no),参数5:默认关联回车键的
  18. if (QMessageBox::Save == QMessageBox::question(this, "ques", "提问", QMessageBox::Save|QMessageBox::Cancel, QMessageBox::Cancel))
  19. {
  20. qDebug() << "选择的是保存";
  21. }else {
  22. qDebug() << "选择的是取消";
  23. }
  24. // 警告对话框
  25. QMessageBox::warning(this, "warning", "警告");
  26. });
  27. }
  28. MainWindow::~MainWindow()
  29. {
  30. delete ui;
  31. }

QMessageBox的简单使用
判断QmessageBox点击的按钮判断QmessageBox点击的按钮

其他标准对话框

  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. #include <QDebug>
  4. #include <QColorDialog>
  5. #include <QFileDialog>
  6. #include <QFontDialog>
  7. MainWindow::MainWindow(QWidget *parent) :
  8. QMainWindow(parent),
  9. ui(new Ui::MainWindow)
  10. {
  11. ui->setupUi(this);
  12. connect(ui->actionnew, &QAction::triggered, [=](){
  13. // 其他标准对话框
  14. // 颜色对话框
  15. // QColor color = QColorDialog::getColor(QColor(244, 0, 0));
  16. // qDebug() << "r=" << color.red() << " g=" << color.green() << " b=" << color.blue() << " a=" << color.alpha();
  17. // 文件对话框 参数1:父亲,参数2:标题,参数3:默认打开路径,参数4:过滤文件格式
  18. // 返回值是选取的路径
  19. // QString str = QFileDialog::getOpenFileName(this, "打开文件", "C:\\Users\\Administrator\\Desktop", "(*.txt)");
  20. // qDebug() << str;
  21. // 字体对话框
  22. bool flag;
  23. QFont font = QFontDialog::getFont(&flag, QFont("华文彩云", 36));
  24. qDebug() << "字体:" << font.family() << " 字号:" << font.pointSize() << " 是否加粗:" << font.bold() << " 是否倾斜:" << font.italic();
  25. });
  26. }
  27. MainWindow::~MainWindow()
  28. {
  29. delete ui;
  30. }

登入窗口布局

按钮组

Button

Tool Button 一般用于图片

Radio Button 配合Group Box进行分组

  1. // 设置单选按钮 男默认选中
  2. ui->rBtnMan->setChecked(true);
  3. // 选中女后打印信息
  4. connect(ui->rBtnWoman, &QRadioButton::clicked, [=](){
  5. qDebug() << "选中女";
  6. });

check box

  1. // 多选按钮
  2. connect(ui->cBox, &QCheckBox::stateChanged, [=](int state){
  3. qDebug() << state;
  4. });

Item Widge…

QListWidget 控件

  1. // 利用listWidget写诗
  2. QListWidgetItem * item = new QListWidgetItem("锄禾日当午");
  3. // 将一行诗放入到listWidget控件中
  4. ui->listWidget->addItem(item);
  5. // 居中
  6. item->setTextAlignment(Qt::AlignHCenter);
  7. // QStringList QList<QString>
  8. QStringList list;
  9. list << "aaaaa" << "bbbb" << "cccc";
  10. ui->listWidget->addItems(list);

QTreeWidget 控件

  1. // treeWidget树控件使用
  2. // 设置水平头
  3. ui->treeWidget->setHeaderLabels(QStringList() << "英雄" << "英雄介绍");
  4. QTreeWidgetItem * liItme = new QTreeWidgetItem(QStringList() << "力量");
  5. QTreeWidgetItem * minItme = new QTreeWidgetItem(QStringList() << "敏捷");
  6. QTreeWidgetItem * zhiItme = new QTreeWidgetItem(QStringList() << "智力");
  7. // 加载顶层的节点
  8. ui->treeWidget->addTopLevelItem(liItme);
  9. ui->treeWidget->addTopLevelItem(minItme);
  10. ui->treeWidget->addTopLevelItem(zhiItme);
  11. // 追加子节的
  12. QStringList heroL1;
  13. QStringList heroL1_2;
  14. heroL1 << "刚被猪" << "前排坦克,能在吸收伤害的同时造成客观的范围输出";
  15. heroL1_2 << "刚被猪" << "前排坦克,能在吸收伤害的同时造成客观的范围输出";
  16. QTreeWidgetItem * l1 = new QTreeWidgetItem(heroL1);
  17. QTreeWidgetItem * l1_2 = new QTreeWidgetItem(heroL1_2);
  18. liItme->addChild(l1);
  19. liItme->addChild(l1_2);
  20. QStringList heroL2;
  21. heroL2 << "刚被猪" << "前排坦克,能在吸收伤害的同时造成客观的范围输出";
  22. QTreeWidgetItem * l2 = new QTreeWidgetItem(heroL2);
  23. minItme->addChild(l2);
  24. QStringList heroL3;
  25. heroL3 << "刚被猪" << "前排坦克,能在吸收伤害的同时造成客观的范围输出";
  26. QTreeWidgetItem * l3 = new QTreeWidgetItem(heroL3);
  27. zhiItme->addChild(l3);

image.png

QTableWidget 控件

  1. // TableWidget控件
  2. // 设置列数
  3. ui->tableWidget->setColumnCount(3);
  4. // 设置水平的表头
  5. ui->tableWidget->setHorizontalHeaderLabels(QStringList() << "姓名" << "性别" << "年龄");
  6. // 设置行数
  7. ui->tableWidget->setRowCount(5);
  8. // 设置正文
  9. // ui->tableWidget->setItem(0, 0, new QTableWidgetItem("亚瑟"));
  10. // 循环
  11. QStringList nameList;
  12. nameList << "亚瑟" << "赵云" << "张飞" << "关羽" << "花木兰";
  13. QList<QString> sexList;
  14. sexList << "男" << "男" << "男" << "男" << "女";
  15. for(int i = 0; i < 5; i++) {
  16. int col = 0;
  17. ui->tableWidget->setItem(i, col++, new QTableWidgetItem(nameList[i]));
  18. ui->tableWidget->setItem(i, col++, new QTableWidgetItem(sexList.at(i)));
  19. // QString::number(i+8) int 转string
  20. ui->tableWidget->setItem(i, col++, new QTableWidgetItem(QString::number(i+8)));
  21. }

image.png

其他

Stacked Widget 控件

  1. //栈控件使用
  2. // 设置默认定位是scrollArea
  3. ui->stackedWidget->setCurrentIndex(0);
  4. // scrollArea按钮
  5. connect(ui->btn_scrollArea, &QPushButton::clicked, [=](){
  6. ui->stackedWidget->setCurrentIndex(1);
  7. });
  8. // toolBox按钮
  9. connect(ui->btn_ToolBox, &QPushButton::clicked, [=](){
  10. ui->stackedWidget->setCurrentIndex(2);
  11. });
  12. // TabWidget按钮
  13. connect(ui->btn_TabWidget, &QPushButton::clicked, [=](){
  14. ui->stackedWidget->setCurrentIndex(0);
  15. });

image.pngimage.png

下拉框 Combo box

  1. // 下拉框添加内容
  2. ui->comboBox->addItem("奔驰");
  3. ui->comboBox->addItem("宝马");
  4. ui->comboBox->addItem("奥迪");
  5. // 点击按钮选中奥迪选项
  6. connect(ui->btn_select, &QPushButton::clicked, [=](){
  7. // ui->comboBox->setCurrentIndex(2);
  8. // 方法二
  9. ui->comboBox->setCurrentText("奥迪");
  10. });

Label可以显示图片

  1. #include "widget.h"
  2. #include "ui_widget.h"
  3. #include <QMovie> // 加载依赖
  4. Widget::Widget(QWidget *parent) :
  5. QWidget(parent),
  6. ui(new Ui::Widget)
  7. {
  8. ui->setupUi(this);
  9. // 利用QLabel显示图片
  10. ui->lal_Image->setPixmap(QPixmap(":/Image/butterfly.png"));
  11. // 利用QLabel显示gif动态图片
  12. QMovie * movie = new QMovie(":/Image/mario.gif");
  13. ui->lbl_movie->setMovie(movie);
  14. // 播放动图
  15. movie->start();
  16. }
  17. Widget::~Widget()
  18. {
  19. delete ui;
  20. }

自定义控件封装

image.png
smallwidget.h文件

  1. #ifndef SMALLWIDGET_H
  2. #define SMALLWIDGET_H
  3. #include <QWidget>
  4. namespace Ui {
  5. class SmallWidget;
  6. }
  7. class SmallWidget : public QWidget
  8. {
  9. Q_OBJECT
  10. public:
  11. explicit SmallWidget(QWidget *parent = 0);
  12. ~SmallWidget();
  13. // 自定义一个方法(声明)
  14. // 设置数字
  15. void setNum(int num);
  16. // 获取数字
  17. int getNum();
  18. private:
  19. Ui::SmallWidget *ui;
  20. };
  21. #endif // SMALLWIDGET_H

smallwidget.cpp文件

  1. #include "smallwidget.h"
  2. #include "ui_smallwidget.h"
  3. SmallWidget::SmallWidget(QWidget *parent) :
  4. QWidget(parent),
  5. ui(new Ui::SmallWidget)
  6. {
  7. ui->setupUi(this);
  8. // QSpinBox移动 QSlider跟着移动
  9. void(QSpinBox:: * spSignal)(int) = &QSpinBox::valueChanged;
  10. connect(ui->spinBox, spSignal, ui->horizontalSlider, &QSlider::setValue);
  11. connect(ui->horizontalSlider, &QSlider::valueChanged, ui->spinBox, &QSpinBox::setValue);
  12. }
  13. // 自定义一个方法(实现) 接口给外部调用
  14. // 设置数字
  15. void SmallWidget::setNum(int num)
  16. {
  17. ui->spinBox->setValue(num);
  18. }
  19. // 获取数字
  20. int SmallWidget::getNum()
  21. {
  22. return ui->spinBox->value();
  23. }
  24. SmallWidget::~SmallWidget()
  25. {
  26. delete ui;
  27. }

widget.cpp文件

  1. #include "widget.h"
  2. #include "ui_widget.h"
  3. #include <QDebug>
  4. Widget::Widget(QWidget *parent) :
  5. QWidget(parent),
  6. ui(new Ui::Widget)
  7. {
  8. ui->setupUi(this);
  9. // 点击按钮获取当前的值
  10. connect(ui->getNowBtn, &QPushButton::clicked, [=](){
  11. qDebug() << ui->widget->getNum();
  12. });
  13. // 点击按钮设置一半值
  14. connect(ui->setHelfBtn, &QPushButton::clicked, [=](){
  15. ui->widget->setNum(50);
  16. });
  17. }
  18. Widget::~Widget()
  19. {
  20. delete ui;
  21. }

QT控件中的鼠标事件

mylabel.h文件

  1. #ifndef MYLABEL_H
  2. #define MYLABEL_H
  3. #include <QLabel>
  4. class myLabel : public QLabel
  5. {
  6. Q_OBJECT
  7. public:
  8. explicit myLabel(QWidget *parent = nullptr);
  9. // 鼠标进入事件
  10. void enterEvent(QEvent *event);
  11. // 鼠标离开
  12. void leaveEvent(QEvent *);
  13. // 重写鼠标事件
  14. // 鼠标的按下
  15. virtual void mousePressEvent(QMouseEvent *ev);
  16. // 鼠标的释放
  17. virtual void mouseReleaseEvent(QMouseEvent *ev);
  18. // 鼠标的按下移动
  19. virtual void mouseMoveEvent(QMouseEvent *ev);
  20. signals:
  21. public slots:
  22. };
  23. #endif // MYLABEL_H

mylabel.cpp文件

  1. #include "mylabel.h"
  2. #include <QDebug>
  3. #include <QMouseEvent>
  4. myLabel::myLabel(QWidget *parent) : QLabel(parent)
  5. {
  6. // 设置鼠标追踪状态 未设置时,鼠标按下移动才进行捕捉
  7. setMouseTracking(true);
  8. }
  9. // 鼠标进入事件
  10. void myLabel::enterEvent(QEvent *event)
  11. {
  12. qDebug() << "鼠标进入了";
  13. }
  14. // 鼠标离开
  15. void myLabel::leaveEvent(QEvent *)
  16. {
  17. qDebug() << "鼠标离开了";
  18. }
  19. // 重写鼠标事件
  20. // 鼠标的按下
  21. void myLabel::mousePressEvent(QMouseEvent *ev)
  22. {
  23. // QT格式化字符串
  24. // global是距离屏幕的距离
  25. // 当鼠标左键按下时,才打印信息
  26. if(ev->button() == Qt::LeftButton) {
  27. QString str = QString("鼠标按下了 x= %1 y=%2 globalX=%3 globalY=%4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
  28. qDebug() << "鼠标点击了" << str;
  29. }
  30. }
  31. // 鼠标的释放
  32. void myLabel::mouseReleaseEvent(QMouseEvent *ev)
  33. {
  34. QString str = QString("鼠标按下了 x= %1 y=%2 globalX=%3 globalY=%4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
  35. qDebug() << "鼠标释放了" << str;
  36. }
  37. // 鼠标的按下移动
  38. void myLabel::mouseMoveEvent(QMouseEvent *ev)
  39. {
  40. // 联合操作
  41. if(ev->buttons() & Qt::LeftButton)
  42. {
  43. QString str = QString("鼠标按下了 x= %1 y=%2 globalX=%3 globalY=%4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
  44. qDebug() << "鼠标按下移动了" << str;
  45. }
  46. }

然后label提升为myLabel类
image.png

定时器1

widget.h文件

  1. #ifndef WIDGET_H
  2. #define WIDGET_H
  3. #include <QWidget>
  4. namespace Ui {
  5. class Widget;
  6. }
  7. class Widget : public QWidget
  8. {
  9. Q_OBJECT
  10. public:
  11. explicit Widget(QWidget *parent = 0);
  12. ~Widget();
  13. // 重写定时器的事件
  14. void timerEvent(QTimerEvent *);
  15. int id1; // 定时器1的唯一标识
  16. int id2; // 定时器2的唯一标识
  17. private:
  18. Ui::Widget *ui;
  19. };
  20. #endif // WIDGET_H

widget.cpp文件

  1. #include "widget.h"
  2. #include "ui_widget.h"
  3. Widget::Widget(QWidget *parent) :
  4. QWidget(parent),
  5. ui(new Ui::Widget)
  6. {
  7. ui->setupUi(this);
  8. // 启动定时器
  9. id1 = startTimer(1000); // 参数1 间隔,单位为ms
  10. id2 = startTimer(2000);
  11. }
  12. void Widget::timerEvent(QTimerEvent *ev)
  13. {
  14. // static为静态,可以提升作用域
  15. // label2每隔1秒+1
  16. if(ev->timerId() == id1)
  17. {
  18. static int num = 1;
  19. ui->label_2->setText(QString::number(num++));
  20. }
  21. // label2每隔2秒+1
  22. if(ev->timerId() == id2)
  23. {
  24. static int num2 = 1;
  25. ui->label_3->setText(QString::number(num2++));
  26. }
  27. }
  28. Widget::~Widget()
  29. {
  30. delete ui;
  31. }

image.png

定时器2

widget.cpp文件

  1. #include "widget.h"
  2. #include "ui_widget.h"
  3. #include <QTimer> // 定时器的类
  4. Widget::Widget(QWidget *parent) :
  5. QWidget(parent),
  6. ui(new Ui::Widget)
  7. {
  8. ui->setupUi(this);
  9. // 定时器第二种方式
  10. QTimer * timer = new QTimer(this);
  11. // 启动定时器
  12. timer->start(500);
  13. connect(timer, &QTimer::timeout, [=](){
  14. // label_4 每隔0.5s加1
  15. static int num = 1;
  16. ui->label_4->setText(QString::number(num++));
  17. });
  18. // 点击暂停按钮 实现停止定时器
  19. connect(ui->btnStop, &QPushButton::clicked, [=](){
  20. timer->stop();
  21. });
  22. // 点击开始按钮 实现开始定时器
  23. connect(ui->btnStart, &QPushButton::clicked, [=](){
  24. timer->start();
  25. });
  26. }
  27. Widget::~Widget()
  28. {
  29. delete ui;
  30. }

开始
image.png

用于事件分发和拦截

  1. #ifndef MYLABEL_H
  2. #define MYLABEL_H
  3. #include <QLabel>
  4. class myLabel : public QLabel
  5. {
  6. Q_OBJECT
  7. public:
  8. explicit myLabel(QWidget *parent = nullptr);
  9. // 鼠标进入事件
  10. void enterEvent(QEvent *event);
  11. // 鼠标离开
  12. void leaveEvent(QEvent *);
  13. // 重写鼠标事件
  14. // 鼠标的按下
  15. virtual void mousePressEvent(QMouseEvent *ev);
  16. // 鼠标的释放
  17. virtual void mouseReleaseEvent(QMouseEvent *ev);
  18. // 鼠标的按下移动
  19. virtual void mouseMoveEvent(QMouseEvent *ev);
  20. // 通过event事件分发器拦截鼠标按下事件
  21. bool event(QEvent *e);
  22. signals:
  23. public slots:
  24. };
  25. #endif // MYLABEL_H
  1. #include "mylabel.h"
  2. #include <QDebug>
  3. #include <QMouseEvent>
  4. myLabel::myLabel(QWidget *parent) : QLabel(parent)
  5. {
  6. // 设置鼠标追踪状态 未设置时,鼠标按下移动才进行捕捉
  7. setMouseTracking(true);
  8. }
  9. // 鼠标进入事件
  10. void myLabel::enterEvent(QEvent *event)
  11. {
  12. qDebug() << "鼠标进入了";
  13. }
  14. // 鼠标离开
  15. void myLabel::leaveEvent(QEvent *)
  16. {
  17. qDebug() << "鼠标离开了";
  18. }
  19. // 重写鼠标事件
  20. // 鼠标的按下
  21. void myLabel::mousePressEvent(QMouseEvent *ev)
  22. {
  23. // QT格式化字符串
  24. // global是距离屏幕的距离
  25. // 当鼠标左键按下时,才打印信息
  26. if(ev->button() == Qt::LeftButton) {
  27. QString str = QString("鼠标按下了 x= %1 y=%2 globalX=%3 globalY=%4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
  28. qDebug() << "鼠标点击了" << str;
  29. }
  30. }
  31. // 鼠标的释放
  32. void myLabel::mouseReleaseEvent(QMouseEvent *ev)
  33. {
  34. QString str = QString("鼠标按下了 x= %1 y=%2 globalX=%3 globalY=%4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
  35. qDebug() << "鼠标释放了" << str;
  36. }
  37. // 鼠标的按下移动
  38. void myLabel::mouseMoveEvent(QMouseEvent *ev)
  39. {
  40. // 联合操作
  41. if(ev->buttons() & Qt::LeftButton)
  42. {
  43. QString str = QString("鼠标按下了 x= %1 y=%2 globalX=%3 globalY=%4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
  44. qDebug() << "鼠标按下移动了" << str;
  45. }
  46. }
  47. // 通过event事件分发器拦截鼠标按下事件
  48. bool myLabel::event(QEvent *e)
  49. {
  50. if(e->type() == QEvent::MouseButtonPress)
  51. {
  52. // static_cast为类型转换 将e转成ev
  53. QMouseEvent *ev = static_cast<QMouseEvent *>(e);
  54. QString str = QString("Event函数中 鼠标按下了 x= %1 y=%2 globalX=%3 globalY=%4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
  55. qDebug() << str;
  56. return true; // true 代表用户自己处理这个事件,不向下分发
  57. }
  58. // 其他事件交给父类处理 默认处理
  59. return QLabel::event(e);
  60. }

绘图事件

QPaint基本设置

widget.h文件

  1. #ifndef WIDGET_H
  2. #define WIDGET_H
  3. #include <QWidget>
  4. namespace Ui {
  5. class Widget;
  6. }
  7. class Widget : public QWidget
  8. {
  9. Q_OBJECT
  10. public:
  11. explicit Widget(QWidget *parent = 0);
  12. ~Widget();
  13. // 绘图事件
  14. void paintEvent(QPaintEvent *event);
  15. private:
  16. Ui::Widget *ui;
  17. };
  18. #endif // WIDGET_H
  1. #include "widget.h"
  2. #include "ui_widget.h"
  3. #include <QPainter> // 画家类
  4. Widget::Widget(QWidget *parent) :
  5. QWidget(parent),
  6. ui(new Ui::Widget)
  7. {
  8. ui->setupUi(this);
  9. }
  10. void Widget::paintEvent(QPaintEvent *event)
  11. {
  12. // 实例化画家对象 this指的是绘图设备
  13. QPainter painter(this);
  14. // 设置画笔
  15. QPen pen(QColor(255, 0, 0));
  16. // 设置画笔的宽度
  17. pen.setWidth(3);
  18. // 设置画笔风格 默认为实线
  19. pen.setStyle(Qt::DotLine);
  20. //使用这个笔
  21. painter.setPen(pen);
  22. // 设置画刷
  23. QBrush brush(QColor(0, 255, 0));
  24. // 设置画刷风格
  25. brush.setStyle(Qt::Dense7Pattern);
  26. // 让画家使用画刷
  27. painter.setBrush(brush);
  28. // 画线
  29. painter.drawLine(QPoint(0, 0), QPoint(100, 100));
  30. // 画圆
  31. painter.drawEllipse(QPoint(100, 100), 50, 50);
  32. // 画矩形 在x:20, y:20画width:50, height:50的矩形
  33. painter.drawRect(QRect(20, 20, 50, 50));
  34. // 画文字
  35. painter.drawText(QRect(10, 200, 100, 50), "好好学习");
  36. }
  37. Widget::~Widget()
  38. {
  39. delete ui;
  40. }

QPaint高级设置

  1. #include "widget.h"
  2. #include "ui_widget.h"
  3. #include <QPainter> // 画家类
  4. Widget::Widget(QWidget *parent) :
  5. QWidget(parent),
  6. ui(new Ui::Widget)
  7. {
  8. ui->setupUi(this);
  9. }
  10. void Widget::paintEvent(QPaintEvent *event)
  11. {
  12. // // 实例化画家对象 this指的是绘图设备
  13. // 高级设置
  14. QPainter painter(this);
  15. // painter.drawEllipse(QPoint(100, 50), 50, 50);
  16. // // 设置抗锯齿能力 效率低
  17. // painter.setRenderHint(QPainter::Antialiasing);
  18. // painter.drawEllipse(QPoint(200, 50), 50, 50);
  19. // 画矩形
  20. painter.drawRect(QRect(20, 20, 50, 50));
  21. // 移动画笔
  22. painter.translate(100, 0);
  23. // 保存画家状态
  24. painter.save();
  25. // 还原画家保存状态
  26. painter.restore();
  27. // 画矩形
  28. painter.drawRect(QRect(20, 20, 50, 50));
  29. }
  30. Widget::~Widget()
  31. {
  32. delete ui;
  33. }

利用画家 画资源图片

widget.h文件

  1. #ifndef WIDGET_H
  2. #define WIDGET_H
  3. #include <QWidget>
  4. namespace Ui {
  5. class Widget;
  6. }
  7. class Widget : public QWidget
  8. {
  9. Q_OBJECT
  10. public:
  11. explicit Widget(QWidget *parent = 0);
  12. ~Widget();
  13. // 绘图事件
  14. void paintEvent(QPaintEvent *event);
  15. // 设置图片的x位置
  16. int posX = 0;
  17. private:
  18. Ui::Widget *ui;
  19. };
  20. #endif // WIDGET_H

widget.ccp文件

  1. #include "widget.h"
  2. #include "ui_widget.h"
  3. #include <QPainter> // 画家类
  4. Widget::Widget(QWidget *parent) :
  5. QWidget(parent),
  6. ui(new Ui::Widget)
  7. {
  8. ui->setupUi(this);
  9. // 点击移动按钮,移动图片
  10. connect(ui->pushButton, &QPushButton::clicked, [=](){
  11. // 如果要手动调用绘图事件 用update更新
  12. posX +=20;
  13. update();
  14. });
  15. }
  16. void Widget::paintEvent(QPaintEvent *event)
  17. {
  18. // // 实例化画家对象 this指的是绘图设备
  19. // 利用画家 画资源图片
  20. QPainter painter(this);
  21. // 如果超出屏幕 从0开始
  22. if(posX > this->width())
  23. {
  24. posX = 0;
  25. }
  26. painter.drawPixmap(posX, 0, QPixmap(":/Image/zf.jpg"));
  27. }
  28. Widget::~Widget()
  29. {
  30. delete ui;
  31. }

绘图设备

widget.h文件

  1. #ifndef WIDGET_H
  2. #define WIDGET_H
  3. #include <QWidget>
  4. namespace Ui {
  5. class Widget;
  6. }
  7. class Widget : public QWidget
  8. {
  9. Q_OBJECT
  10. public:
  11. explicit Widget(QWidget *parent = 0);
  12. ~Widget();
  13. // 绘图事件
  14. void paintEvent(QPaintEvent *);
  15. private:
  16. Ui::Widget *ui;
  17. };
  18. #endif // WIDGET_H

widget.ccp文件

  1. #include "widget.h"
  2. #include "ui_widget.h"
  3. #include <QPixmap>
  4. #include <QPainter>
  5. #include <QImage>
  6. #include <QPicture>
  7. Widget::Widget(QWidget *parent) :
  8. QWidget(parent),
  9. ui(new Ui::Widget)
  10. {
  11. ui->setupUi(this);
  12. // Pixmap绘图设备 专门为平台做了显示的优化
  13. QPixmap pix(300, 300);
  14. // 填充颜色
  15. pix.fill(Qt::white);
  16. // 声明画家
  17. QPainter painter(&pix);
  18. painter.setPen(QPen(Qt::green));
  19. painter.drawEllipse(QPoint(150, 0150), 100, 100);
  20. // 保存
  21. pix.save("E:\\pix.png");
  22. // QImage 绘图设备 可以对像素进行访问
  23. QImage img(300, 300, QImage::Format_RGB32);
  24. img.fill(Qt::white);
  25. QPainter painter(&img);
  26. painter.setPen(QPen(Qt::blue));
  27. painter.drawEllipse((QPoint(150, 150), 100, 100));
  28. // 保存
  29. img.save("E:\\img.png");
  30. // QPicture 绘图设备 可以记录和重现绘图指令
  31. QPicture pic;
  32. QPainter painter;
  33. painter.begin(&pic); // 开始往pic上画
  34. painter.setPen(QPen(Qt::cyan));
  35. painter.drawEllipse((QPoint(150, 150), 100, 100));
  36. painter.end(); // 结束画画
  37. pic.save("E:\\pic.zt");
  38. }
  39. // 绘图事件
  40. void Widget::paintEvent(QPaintEvent *)
  41. {
  42. QPainter painter(this);
  43. // 利用QImage 对象进行修改
  44. QImage img;
  45. img.load((":/Image/Luffy.png"));
  46. // 修改像素点
  47. for(int i=50; i<100; i++)
  48. {
  49. for(int j=50; j<100; j++)
  50. {
  51. QRgb value = qRgb(255, 0, 0);
  52. img.setPixel(i, j, value);
  53. }
  54. }
  55. painter.drawImage(0, 0, img);
  56. QPainter painter(this);
  57. // 重现QPicture的绘图指令
  58. QPicture pic;
  59. pic.load("E:\\pic.zt");
  60. painter.drawPicture(0, 0, pic);
  61. }
  62. Widget::~Widget()
  63. {
  64. delete ui;
  65. }

QFile文件读写操作

  1. #include "widget.h"
  2. #include "ui_widget.h"
  3. #include <QFileDialog>
  4. #include <QFile> // 对文件进行读和写
  5. #include <QTextCodec>
  6. Widget::Widget(QWidget *parent) :
  7. QWidget(parent),
  8. ui(new Ui::Widget)
  9. {
  10. ui->setupUi(this);
  11. // 点击选取文件按钮,弹出文件对话框
  12. connect(ui->pushButton, &QPushButton::clicked, [=](){
  13. QString path = QFileDialog::getOpenFileName(this, "打开文件", "c:\\Users\\Administrator\\Desktop", "*txt");
  14. // 将路径放入到lineEdit中
  15. ui->lineEdit->setText(path);
  16. // 编码格式类
  17. QTextCodec * codec = QTextCodec::codecForName("gbk");
  18. // 读取内容 放入到 textEdit中
  19. // QFile默认支持utf-8格式
  20. QFile file(path); // 参数就是读取文件的路径
  21. /*************************************************
  22. * QIODevice::ReadWrite 可读写
  23. * QIODevice::Text 换行符生效
  24. * QIODevice::Append 追加写入
  25. * QFile::Truncate 表示将原文件清空
  26. **************************************************/
  27. // 设置打开方式
  28. file.open(QIODevice::ReadOnly);
  29. QByteArray array = file.readAll();
  30. // // 按行读
  31. // QByteArray array2;
  32. // // 循环读取文件,值到无文件可读
  33. // while(!file.atEnd()) // atEnd判断是否到文件末尾了
  34. // {
  35. // array2 += file.readLine();
  36. // }
  37. // 将读取到的数据放入textEdit中
  38. ui->textEdit->setText(array);
  39. // 使用toUnicode进行转码
  40. // ui->textEdit->setText(codec->toUnicode(array));
  41. // 对文件对象进行关闭
  42. file.close();
  43. // 进行写文件
  44. file.open(QIODevice::Append); // 用追加的方式进行写
  45. file.write("啊啊啊啊");
  46. file.close();
  47. });
  48. }
  49. Widget::~Widget()
  50. {
  51. delete ui;
  52. }

QFileInfo文件信息读取

  1. #include "widget.h"
  2. #include "ui_widget.h"
  3. #include <QFileDialog>
  4. #include <QTextCodec>
  5. #include <QFileInfo> // 获取文件信息头
  6. #include <QDebug>
  7. #include <QDateTime>
  8. Widget::Widget(QWidget *parent) :
  9. QWidget(parent),
  10. ui(new Ui::Widget)
  11. {
  12. ui->setupUi(this);
  13. // 点击选取文件按钮,弹出文件对话框
  14. connect(ui->pushButton, &QPushButton::clicked, [=](){
  15. QString path = QFileDialog::getOpenFileName(this, "打开文件", "c:\\Users\\Administrator\\Desktop", "*txt");
  16. // QFileInfo 文件信息类
  17. QFileInfo info(path);
  18. qDebug() << "大小:" << info.size() << " 后缀名:" << info.suffix() << " 文件名称:" << info.fileName() << " 文件路径:" << info.filePath();
  19. qDebug() << "创建日期" << info.created().toString("yyyy/MM/dd hh:mm:ss");
  20. qDebug() << "最后修改日期" << info.lastModified().toString("yyyy-MM-dd hh:mm:ss");
  21. });
  22. }
  23. Widget::~Widget()
  24. {
  25. delete ui;
  26. }

外链

对话框—QDialog(自定义对话框简单实例)

http://blog.sina.com.cn/s/blog_726c4bd201010oa4.html