qt5_qt5教程 - CSDN
精华内容
参与话题
  • 课程讲解基于QT5.9 SDK,包含QT界面编程的核心内容,并提供全部源码,课程讲解方式是接口讲解、分析、演示示例,课程讲解QTCreator在不同平台的配置方法,linux,windows,mac,课程演示主要以vs2015+QT5.9为主,...
  • Qt5基本教程

    万次阅读 多人点赞 2017-01-09 10:22:17
    ...据说非常适合qt5入门学习,最近正在参考,转载希望更多人看到,也为自己以后找到本资料提供方便。 Qt 学习之路 2》目录 序Qt 前言Hello, world!信号槽自定义信号槽Qt

    原地址:http://www.devbean.NET/2012/08/qt-study-road-2-catelog/


    本教程以qt5为主,部分地方会涉及qt4。据说非常适合qt5入门学习,最近正在参考,转载希望更多人看到,也为自己以后找到本资料提供方便。


    Qt 学习之路 2》目录

    1. Qt 前言
    2. Hello, world!
    3. 信号槽
    4. 自定义信号槽
    5. Qt 模块简介
    6. MainWindow 简介
    7. 添加动作
    8. 资源文件
    9. 对象模型
    10. 布局管理器
    11. 菜单栏、工具栏和状态栏
    12. 对话框简介
    13. 对话框数据传递
    14. 标准对话框 QMessageBox
    15. 深入 Qt5 信号槽新语法
    16. 文件对话框
    17. 事件
    18. 事件的接受与忽略
    19. event()
    20. 事件过滤器
    21. 事件总结
    22. 自定义事件
    23. Qt 绘制系统简介
    24. 画刷和画笔
    25. 反走样
    26. 渐变
    27. 坐标系统
    28. 绘制设备
    29. Graphics View Framework
    30. 贪吃蛇游戏(1)
    31. 贪吃蛇游戏(2)
    32. 贪吃蛇游戏(3)
    33. 贪吃蛇游戏(4)
    34. 文件
    35. 二进制文件读写
    36. 文本文件读写
    37. 存储容器
    38. 遍历容器
    39. 隐式数据共享
    40. model/view 架构
    41. QListWidget、QTreeWidget 和 QTableWidget
    42. QStringListModel
    43. QFileSystemModel
    44. 模型
    45. 视图和委托
    46. 视图选择
    47. QSortFilterProxyModel
    48. 自定义只读模型
    49. 自定义可编辑模型
    50. 布尔表达式树模型
    51. 使用拖放
    52. 自定义拖放数据
    53. 剪贴板
    54. 数据库操作
    55. 使用模型操作数据库
    56. 可视化显示数据库数据
    57. 编辑数据库外键
    58. 使用流处理 XML
    59. 使用 DOM 处理 XML
    60. 使用 SAX 处理 XML
    61. 保存 XML
    62. 使用 QJson 处理 JSON
    63. 使用 QJsonDocument 处理 JSON
    64. 访问网络(1)
    65. 访问网络(2)
    66. 访问网络(3)
    67. 访问网络(4)
    68. 进程
    69. 进程间通信
    70. 线程简介
    71. 线程和事件循环
    72. Qt 线程相关类
    73. 线程和 QObject
    74. 线程总结
    75. QML 和 QtQuick 2
    76. QML 语法
    77. QML 基本元素
    78. QML 组件
    展开全文
  • QT/C++从新手到老手系列之QT基础篇

    万人学习 2018-10-22 21:38:12
    本系列课程励志于带领你学习QT5/C++,从开发环境(QTCreator和VS2013两种)搭建到实际项目实战,从入门到精通。每一个部分均有理论知识介绍、接口讲解、实例代码讲解,讲解过程中不断穿插老师在开发过程中遇到的问题...
  • QT5的安装和配置

    万次阅读 2018-05-21 15:48:33
    记录一下我QT的下载配置QT镜像下载选择最新的5.10,选择5.10.1

    写这篇文章,记录一下我QT的下载和配置


    QT下载

    选择最新的5.10,选择5.10.1







    下面是我勾选的全部

    跟vs、android、UMP有关的插件我都没选,web的随便,MinGW得下载


    等待其安装完,大概7g多



    下载完之后,我们需要配置一下环境变量。尽量将其往前移,否则会造成后面无法定位程序输入点的问题

    我的是  D:\QT\qt\5.10.1\mingw53_32\bin  和  D:\QT\qt\Tools\mingw530_32\bin



    配置完之后运行,点击new project就可以新建工程了



    按照指示一步步建立新工程后,打开forms找到一个ui文件,点击就可以通过designer编辑了




    展开全文
  • 使用Qt5开发桌面程序

    万次阅读 多人点赞 2019-09-25 23:53:30
    Qt开发信息管理客户端一.Qt的简介二.Qt中的重要概念1.信号与槽机制信号(signal)槽(slot)2.Lambda表达式三.使用Qt设计师快速开发1. 环境搭建(1)连接Mysql数据库2.设计你的窗口(1)添加4个选项卡来切换信息的显示...

    一.Qt的简介

    Qt 是一个1991年由Qt Company开发的跨平台C++图形用户界面应用程序开发框架。它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器。基本上,Qt 同 Windows 平台上的 MFC,OWL,VCL,ATL 是同类型的东西。

    使用Qt有哪些优点:

    • 优良的跨平台性 一次编写,处处运行
    • 面向对象 模块化的设计
    • 丰富的 API 良好的开发文档

    使用Qt开发的著名程序有:

    • Google Earth
    • Opera(浏览器)
    • VirtualBox(创建虚拟机)
    • wps Office(著名办公软件)

    二.Qt中的重要概念

    1.信号与槽机制

    用Java做过桌面程序的伙伴都知道,我们需要为按钮、文本输入框、窗体等各种组件添加事件监听器(鼠标监听器、键盘监听器)来与用户产生交互。在Qt中,信号与槽函数就负责交互任务。

    • 信号(signal)

    作用:发出一个信号,可被所有对象监听,该信号是没有目的的,就像校园里的广播一样,所有人都会听到。在Qt中,这也称为信号的广播机制,如果有对象对这个信号感兴趣,那么它可以使用connect函数来连接此信号,将这个信号(signal)与自己的一个槽(slot)绑定来进行处理。

    • 槽(slot)

    作用:接收到信号后要如何处理(进行什么动作),其本质是类的一个成员函数,和C++成员函数几乎无区别。可以为任意类型:public、protected、private,唯一区别在于:槽函数可以绑定信号,每当与槽函数绑定的信号被发射时,该槽函数将被触发调用。
    connect()函数最常用的一般形式:

    connect(sender, &Send::signal, receiver, &Receiver::slot)
    

    可以解释为:
    sender:发送者
    signal:信号
    receiver:接收者
    slot:动作

    举个例子,在Qt4中:

    connect(button, SIGNAL(clicked()), &a, SLOT(quit()));
    

    现在有一个名为button的按钮,一个名为a的窗口,connect函数将按钮的点击信号绑定在a的一个槽函数,那么当按钮button被点击后,a执行quit操作。

    2.Lambda表达式

    在Qt5中,可以使用Lambda表达式来定义并创建匿名的函数对象,不过这是C++11引入的新特性,如果要使用Lambda表达式,必须在.pro文件中写入

    CONFIG += c++11
    
    connect(button, &QPushButton::clicked,
                // = :把外部所有局部变量、类中所有成员以值传递方式
                // this: 类中所有成员以值传递方式
                // & : 把外部所有局部变量, 引用符号
                [=]()
                {
                    qDebug() <<" button is clicked";
                }
                );
    

    三.使用Qt设计师快速开发

    1. 环境搭建

    我使用Qt官方提供的Qt 5.12.3 安装时会安装Qt Creator 4.9.0 这个IDE,数据库使用Mysql x64 5.6版本.

    (1)连接Mysql数据库

    • 使用ODBC driver连接数据库,你需要先将驱动复制到Qt 安装目录下。
      驱动位置一般在你的数据库安装目录下(例如):
    C:\Program Files\MySQL\MySQL Server 5.6\lib
    

    复制上面目录下的 libmysql.dll文件到Qt安装目录的bin目录下:

    C:\Qt\Qt5.12.3\5.12.3\mingw73_64\bin
    
    • 测试连接数据库是否成功
      打开Qt->New Project->Qt Widget Application->项目名称->mainWindow->勾选创建界面
      在这里插入图片描述
      在demo1.pro 后添加sql ,并点击小锤子图标,作用是编译但不运行,编译添加的sql模块
      在这里插入图片描述
      打开mainWindow.cpp,添加以下头文件代码:
    #include<QSqlDatabase>
    #include<QDebug>
    #include<QMessageBox>
    #include<QSqlError>
    #include<QSqlTableModel>
    #include<QSqlRecord>
    

    编写连接数据库的代码

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    
    #include<QSqlDatabase>
    #include<QDebug>
    #include<QMessageBox>
    #include<QSqlError>
    #include<QSqlTableModel>
    #include<QSqlRecord>
    
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    
        
        //连接数据库
        QSqlDatabase db= QSqlDatabase::addDatabase("QMYSQL");
        //设置数据库
        db.setHostName("127.0.0.1");
        db.setPort(3306);
        db.setDatabaseName("book");
        db.setUserName("root");
        db.setPassword("123456");
    
        //打开时数据库
        if(!db.open() )
        {
            qDebug()<<"连接失败";
        }
        else
        {
            qDebug()<<"连接成功";
    
        }
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    

    点击“运行”按钮,查看控制台信息
    连接后的信息
    如果连接不成功,可能会出现以下问题:

    • Qt连接MySQL的时候提示“QSqlDatabase: QMYSQL driver not loaded”,

    原因一:缺少文件
    解决办法:
    从 C:\Program Files\MySQL\MySQL Server 5.6\lib中将 libmysql.dll 文件复制C:\Qt\Qt5.12.3\5.12.3\mingw73_64\bin中。运行程序

    原因二:Qt Creator与MySQL位数不统一
    如果上面的方法试过了还是不行那么应该是你安装的MySQL和QT的位数不同,可以打开Mysql控制台 输入show variables like ‘%version_%’;
    即可查看Mysql位数。

    解决办法:
    查看Qt Creator的位数,若为32位,则去下载32位的 libmysql.dll(自行搜索),重新运行程序。

    2.设计你的窗口

    我在book数据库中建立4张信息表,book(书籍表)、customer(客户表)、worker(职工表)、sale(销售信息表)

    Qt遵循MVC的设计模式:

    • M (model)模型层,一般存放持久数据,Headers文件夹下的 .h文件
    • V(view)视图层,将模型层中的数据显示出来,Forms文件夹下的 .ui 文件
    • C(controller)控制层,负责从视图读取数据,并向模型发送数据,Sources文件夹下的 .cpp 文件

    (1)添加4个选项卡来切换信息的显示

    打开demo1->Forms->mainwindow.ui
    在这里插入图片描述

    (2)为图书选项卡添加TableView控件和一些功能按钮

    在这里插入图片描述

    (3)添加布局

    在这里插入图片描述

    (4)将数据库的表与QSqlTableModel绑定,再将QSqlTableModel放在TableView(控件)中显示

    先在mainwindow.h中添加头文件,并在private下声明一个私有QSqlTableModel 的对象

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QMainWindow>
    #include<QSqlTableModel>
    
    namespace Ui {
    class MainWindow;
    }
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        explicit MainWindow(QWidget *parent = nullptr);
        ~MainWindow();
    
    private slots:
        void on_pushButton_clicked();
    
    private:
        Ui::MainWindow *ui;
        QSqlTableModel *bookModel;
    };
    
    #endif // MAINWINDOW_H
    
    

    在mainwindow.cpp中将表book与bookModel绑定,再将bookModel放在图书选项卡的tableView中显示

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    
    #include<QSqlDatabase>
    #include<QDebug>
    #include<QMessageBox>
    #include<QSqlError>
    #include<QSqlTableModel>
    #include<QSqlRecord>
    
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    
    
        //连接数据库
        QSqlDatabase db= QSqlDatabase::addDatabase("QMYSQL");
        //设置数据库
        db.setHostName("127.0.0.1");
        db.setPort(3306);
        db.setDatabaseName("book");
        db.setUserName("root");
        db.setPassword("123456");
    
        //打开时数据库
        if(!db.open() )
        {
            qDebug()<<"连接失败";
        }
        else
        {
            qDebug()<<"连接成功";
    
        }
    
        bookModel=new QSqlTableModel();//为bookModel分配空间
        bookModel->setTable("book");//指定表 ,此处将book表与bookModel绑定
        bookModel->select();//显示表里所有数据
        ui->tableView_book->setModel(bookModel);// 将bookModel放在tableView_book中
    
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    

    点击运行,查看效果
    在这里插入图片描述
    但是发现,表头没有改过来,并且表里的数据可以直接修改,并且修改后数据库里的数据也同时被修改了,所以还需要设置表头和编辑策略

    ui->tableView_book->setModel(bookModel);// 将bookModel放在tableView_book中
        //设置表头
        bookModel->setHeaderData(0,Qt::Horizontal,"图书编号");
        bookModel->setHeaderData(1,Qt::Horizontal,"书名");
        bookModel->setHeaderData(2,Qt::Horizontal,"作者");
        bookModel->setHeaderData(3,Qt::Horizontal,"版次");
        bookModel->setHeaderData(4,Qt::Horizontal,"单价(元)");
        bookModel->setHeaderData(5,Qt::Horizontal,"出版社");
        bookModel->setHeaderData(6,Qt::Horizontal,"所属类别");
        //设置model的编辑策略 为 手动提交修改
        bookModel->setEditStrategy(QSqlTableModel::OnManualSubmit);
    

    (5)为按钮添加事件监听器

    1.为添加按钮添加槽
    右击添加按钮->转到槽->clicked(),鼠标单击时,按钮发出signal,由槽函数接受处理在这里插入图片描述

    void MainWindow::on_pushButton_clicked()
    {
        //添加空记录
        QSqlRecord record=bookModel->record();
    
        int row=bookModel->rowCount();
        bookModel->insertRecord(row,record);
    }
    

    无论是添加还是删除,点击确定后才会去执行sql语句,即提交事务
    2.为删除按钮添加槽
    右击删除按钮->转到槽->clicked(),处理代码如下

    void MainWindow::on_pushButton_2_clicked()
    {
        //获取选中的模型
         QItemSelectionModel *smodel=ui->tableView_book->selectionModel();
         //获取模型中的索引
         QModelIndexList list=smodel->selectedRows();
         //删除所有选中的行
         for(int i=0;i<list.size();i++)
         {
             bookModel->removeRow(list.at(i).row());
         }
    }
    

    在这里插入图片描述
    这样,当你在选中某行后,点击删除按钮,行的左侧会出现 ! 号,这是因为我设置了编辑策略为手动提交,即向数据库添加了事务,所以为确定添加槽
    3.为确定按钮添加槽
    右键 确定->转到槽->clicked()

    void MainWindow::on_pushButton_3_clicked()
    {
         bookModel->submitAll();
    }
    

    5.为取消按钮添加槽

    void MainWindow::on_pushButton_4_clicked()
    {
        //取消完再提交一次
        bookModel->revertAll();
        bookModel->submitAll();
    }
    

    6.为查找按钮添加槽
    此处设置了两个查询条件
    在这里插入图片描述

    void MainWindow::on_pushButton_6_clicked()
    {
        QString name=ui->lineEdit_name->text();//获取用户输入
        QString id=ui->lineEdit_id->text();
        //组包 %1为占位符,第一个参数,%2为第二个参数
        QString str=QString("name='%1' or id='%2' ").arg(name,id);
        //添加过滤器
        bookModel->setFilter(str);
        bookModel->select();
    }
    

    6.为显示所有按钮添加槽

    void MainWindow::on_pushButton_5_clicked()
    {
        bookModel->setTable("book");//重新关联表
        bookModel->select();//再次显示所有数据
    }
    

    3.美化窗口控件

    • 为选项卡设置图标
      修改字体大小,选择font->14
      在这里插入图片描述
      去互联网找需要的图标,此处使用阿里巴巴矢量图标库的图标资源
      下载好图标资源后,将它们放在一个image文件夹下,并将此image文件夹拷贝至项目根目录下
      在这里插入图片描述
      右键项目名 demo1->Add New->Qt->Qt Resource File
      填上文件名,先选择“添加前缀” ,只留下 / 即可,再选择添加文件
      在这里插入图片描述
      为选项卡添加图标:添加时需要图片的路径
      右击img.qrc->open in editor->右击图片->复制资源路径到剪切板
    //添加图标
        ui->tabWidget->setTabIcon(0,QIcon("://image/book.png"));
        ui->tabWidget->setTabIcon(1,QIcon("://image/职工.png"));
        ui->tabWidget->setTabIcon(2,QIcon("://image/客户.png"));
        ui->tabWidget->setTabIcon(3,QIcon("://image/销售订单.png"));
        ui->tabWidget->setIconSize(QSize(25,25));
    

    在这里插入图片描述
    接着为按钮添加图标

    //按钮添加图标
        ui->pushButton->setIcon(QIcon("://image/新增.png"));
    //    ui->pushButton->setIconSize(QSize(25,25));//图标大小
    
        ui->pushButton_2->setIcon(QIcon("://image/删 除 .png"));
        ui->pushButton_3->setIcon(QIcon("://image/确定.png"));
        ui->pushButton_4->setIcon(QIcon("://image/取消.png"));
        ui->pushButton_6->setIcon(QIcon("://image/查找.png"));
        ui->pushButton_5->setIcon(QIcon("://image/所有.png"));
    

    效果
    在这里插入图片描述

    4.使用QCharts绘制图表实现数据可视化

    官方推出QCharts后,Qt画图再也不用需要配置第三方的qcustomplot和qwt插件了,QCharts功能比两者都好,且易用安装和使用。
    使用QCharts绘图,你必须在安装Qt时勾选QCharts模块(默认不勾选),否则不能使用QCharts.
    此处以柱状图为例演示官方示例的使用:
    Qt欢迎页->示例->输入barmodelmapper
    在这里插入图片描述
    打开运行:在这里插入图片描述
    下面将它用到自己的项目中,可以看到他有两个头文件和.cpp文件,分别是:CustomTableModel和TableWidget
    在这里插入图片描述
    从头文件可以看到它继承自QAbstractTableModel,所以我在项目中建立两个Qt Item Model文件,名字和示例一致
    在这里插入图片描述
    1.在demo1.pro中添加charts,并点击小锤子编译此模块
    在这里插入图片描述
    2.建立文件
    (1)创建CustomTableModel:
    右击项目名demo1->Add New->Qt ->Qt Item Model
    class Name:输入CustomTableModel(和示例保持一致)
    Base Class:选择QAbstractTableModel
    (2)创建TableWidget:
    右击项目名demo1->Add New->Qt ->Qt Item Model
    class Name:TableWidget
    Base Class:选择QAbstractTableModel
    (3)将官方示例中customTableModel和TableWidget的头文件和.cpp文件内容直接复制到对应的建立好的2个头文件和cpp文件中

    3.修改main函数,看是否成功运行
    向main函数中添加头文件“tablewidget.h”,并生成一个实例,运行该实例:

    #include "mainwindow.h"
    #include <QApplication>
    #include"tablewidget.h"
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
    //    MainWindow w;
    //    w.show();
    
        TableWidget t;
        t.show();
    
        return a.exec();
    }
    
    

    效果如下:
    在这里插入图片描述
    在我们的项目中成功运行了该官方实例,下面让这个图显示我们数据库中的数据
    以显示数据库表sale中的销售信息为例,统计sale表中2018年和2019年每个月书籍的总销售量。
    因此,我修改了CustomTableModel.cpp和TableWidget.cpp的部分代码:
    CustomTableModel.cpp:

    #include "customtablemodel.h"
    #include <QtCore/QVector>
    #include <QtCore/QTime>
    #include <QtCore/QRect>
    #include <QtCore/QRandomGenerator>
    #include <QtGui/QColor>
    #include<QDebug>
    #include<QMessageBox>
    #include<QSqlError>
    #include<QSqlTableModel>
    #include<QSqlRecord>
    #include<QSqlDatabase>
    #include<QSqlQuery>
    
    
    CustomTableModel::CustomTableModel(QObject *parent) :
        QAbstractTableModel(parent)
    {
        //连接数据库
        QSqlDatabase db= QSqlDatabase::addDatabase("QMYSQL");
        //设置数据库
        db.setHostName("127.0.0.1");
        db.setPort(3306);
        db.setDatabaseName("book");
        db.setUserName("root");
        db.setPassword("123456");
    
        //打开时数据库
        if(!db.open() )
        {
            qDebug()<<"连接失败";
    
            return;
        }
        else
        {
            qDebug()<<"连接成功";
        }
    
        QSqlQuery query;
    
    
        //
        m_columnCount = 2;
        m_rowCount = 12;
        QString a[]={"2018","2019"};
        // m_data
        for (int i = 0; i < m_rowCount; i++)
        {
        //类型为qreal的一维向量
            QVector<qreal>* dataVec = new QVector<qreal>(m_columnCount);
            for (int k = 0; k < dataVec->size(); k++)
            {
    //            if (k % 2 == 0)
    //                dataVec->replace(k, i * 50 + QRandomGenerator::global()->bounded(20));
    //            else
    //                dataVec->replace(k, QRandomGenerator::global()->bounded(100));
     //用YEAR、Month这两个数据库中内置函数,分别统计每月的书籍销售量
                QString sql=QString("select SUM(count) from sale where YEAR(saledate)='%1' and"
                            " MONTH(saledate)='%2' ").arg(a[k],QString::number(i+1));
    //            qDebug()<<sql<<"\n";
                query.exec(sql);
                while(query.next())
                {
                   int count=query.value(0).toInt();
                   //销售量插入到dataVec
                    dataVec->replace(k,count);
                }
    
             }
              //向m_data追加dataVec
            m_data.append(dataVec);
    
        }
    }
    
    CustomTableModel::~CustomTableModel()
    {
        qDeleteAll(m_data);
    }
    
    int CustomTableModel::rowCount(const QModelIndex &parent) const
    {
        Q_UNUSED(parent)
        return m_data.count();
    }
    
    int CustomTableModel::columnCount(const QModelIndex &parent) const
    {
        Q_UNUSED(parent)
        return m_columnCount;
    }
    
    QVariant CustomTableModel::headerData(int section, Qt::Orientation orientation, int role) const
    {
        if (role != Qt::DisplayRole)
            return QVariant();
    
        if (orientation == Qt::Horizontal)
            return QString("201%1").arg(section+8);
        else
            return QString("%1").arg(section + 1);
    }
    
    QVariant CustomTableModel::data(const QModelIndex &index, int role) const
    {
        if (role == Qt::DisplayRole) {
            return m_data[index.row()]->at(index.column());
        } else if (role == Qt::EditRole) {
            return m_data[index.row()]->at(index.column());
        } else if (role == Qt::BackgroundRole) {
            for (const QRect &rect : m_mapping) {
                if (rect.contains(index.column(), index.row()))
                    return QColor(m_mapping.key(rect));
            }
    
            // cell not mapped return white color
            return QColor(Qt::white);
        }
        return QVariant();
    }
    
    bool CustomTableModel::setData(const QModelIndex &index, const QVariant &value, int role)
    {
        if (index.isValid() && role == Qt::EditRole) {
            m_data[index.row()]->replace(index.column(), value.toDouble());
            emit dataChanged(index, index);
            return true;
        }
        return false;
    }
    
    Qt::ItemFlags CustomTableModel::flags(const QModelIndex &index) const
    {
        return QAbstractItemModel::flags(index) | Qt::ItemIsEditable;
    }
    
    void CustomTableModel::addMapping(QString color, QRect area)
    {
        m_mapping.insertMulti(color, area);
    }
    
    
    

    TableWidget.cpp代码修改如下:

    #include "tablewidget.h"
    #include <QtWidgets/QGridLayout>
    #include <QtWidgets/QTableView>
    #include <QtCharts/QChart>
    #include <QtCharts/QChartView>
    #include <QtCharts/QLineSeries>
    #include <QtCharts/QVXYModelMapper>
    #include <QtCharts/QBarSeries>
    #include <QtCharts/QBarSet>
    #include <QtCharts/QVBarModelMapper>
    #include <QtWidgets/QHeaderView>
    #include <QtCharts/QBarCategoryAxis>
    #include <QtCharts/QValueAxis>
    #include<QDebug>
    
    QT_CHARTS_USE_NAMESPACE
    
    TableWidget::TableWidget(QWidget *parent)
        : QWidget(parent)
    {
        qDebug()<<"窗口已生成";
        // create simple model for storing data
        // user's table data model
        //! [1]
        m_model = new CustomTableModel;
        //! [1]
    
        //! [2]
        // create table view and add model to it
        QTableView *tableView = new QTableView;
        tableView->setModel(m_model);
        tableView->setMinimumWidth(300);
        tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
        tableView->verticalHeader()->setSectionResizeMode(QHeaderView::Stretch);
        m_model->setParent(tableView);
        //! [2]
    
        //! [3]
        QChart *chart = new QChart;
        chart->setAnimationOptions(QChart::AllAnimations);
        //! [3]
    
        // series 1
        //! [4]
        QBarSeries *series = new QBarSeries;
    
        int first = 0;
        int count = 12;
        QVBarModelMapper *mapper = new QVBarModelMapper(this);
        mapper->setFirstBarSetColumn(0);
        mapper->setLastBarSetColumn(1);
        mapper->setFirstRow(first);
        mapper->setRowCount(count);
        mapper->setSeries(series);
        mapper->setModel(m_model);
        chart->addSeries(series);
        //! [4]
    
        //! [5]
        // for storing color hex from the series
        QString seriesColorHex = "#000000";
    
        // get the color of the series and use it for showing the mapped area
        QList<QBarSet *> barsets = series->barSets();
        for (int i = 0; i < barsets.count(); i++) {
            seriesColorHex = "#" + QString::number(barsets.at(i)->brush().color().rgb(), 16).right(6).toUpper();
            m_model->addMapping(seriesColorHex, QRect(1 + i, first, 1, barsets.at(i)->count()));
        }
        //! [5]
    
        //! [6]
        QStringList categories;
        //修改坐标字段
        categories << "1月" << "2月" << "3月" << "4月" <<"5月"<<"6月"<<"7月"
                   <<"8月"<<"9月"<<"10月"<<"11月"<<"12月";
        QBarCategoryAxis *axisX = new QBarCategoryAxis();
        axisX->append(categories);
        chart->addAxis(axisX, Qt::AlignBottom);
        series->attachAxis(axisX);
        QValueAxis *axisY = new QValueAxis();
        chart->addAxis(axisY, Qt::AlignLeft);
        series->attachAxis(axisY);
        //! [6]
    
        //! [7]
        QChartView *chartView = new QChartView(chart);
        chartView->setRenderHint(QPainter::Antialiasing);
        chartView->setMinimumSize(800, 600);
        //! [7]
    
        //! [8]
        // create main layout
        QGridLayout *mainLayout = new QGridLayout;
        mainLayout->addWidget(tableView, 1, 0);
        mainLayout->addWidget(chartView, 1, 1);
        mainLayout->setColumnStretch(1, 1);
        mainLayout->setColumnStretch(0, 0);
        setLayout(mainLayout);
        //! [8]
    }
    
    

    运行后的柱状图变成了下面这样,可以看到,数据是从数据库读出(在sale表中插入测试数据即可测试)
    在这里插入图片描述
    demo源码已上传至github:点我去下载https://github.com/HelloZzy23/bookManageClient

    展开全文
  • QT5 基础使用helloworld及发布

    千次阅读 2017-09-24 10:01:57
    创建hello world程序 1.运行Qt Creator ...期待已久的Qt Creator主界面如下图所示。以后再想运行Qt Creator,... QtCreator作为Qt官方的开发环境,对Qt各方面支持都非常完善,而且使用起来体验也非常好,所以没

    创建hello world程序


    1.运行Qt Creator


    期待已久的Qt Creator主界面如下图所示。以后再想运行Qt Creator,可以到系统开始菜单中找到它,即Qt Creator 4.2.1 (Community)。





           QtCreator作为Qt官方的开发环境,对Qt各方面支持都非常完善,而且使用起来体验也非常好,所以没有特殊情况,建议大家使用Qt Creator进行Qt开发(PS:小白疑惑:难道还能使用其他IDE进行Qt开发?答疑:当然了,比如用的比较多的VS,不仅如此,即便不用IDE,直接使用记事本也可以编写Qt程序!)。

     

           QtCreator主界面分为了6个模式:欢迎模式、编辑模式、设计模式、Debug调试模式、项目模式和帮助模式,分别由左侧的6个图标进行切换,对应的快捷键是Ctrl + 数字1到6。现在显示的就是欢迎界面,这里可以看到一些入门教程、开发的项目列表、Qt提供的示例程序,单击一个示例程序就可以直接打开该项目。单击左侧的Get Started Now会进入帮助模式,并打开Qt Creator指南,刚接触Qt的同学可以把里面的内容简单看下,当然,帮助中的内容是全英文的。

     

     

    2.创建项目

     

     

    我们使用欢迎界面Projects页面上的New Project按钮来创建新的项目(当然也可以在文件菜单中创建项目,或者直接使用Ctrl+N快捷键)。在项目模板中选择Application,然后选择Qt Widgets Application,这样便会生成一个桌面Qt图形界面项目,如下图所示。其他项目的创建会在后面的教程中讲到。



     

           然后更改项目名称和路径,这里名称可以设置为helloworld,注意名称和路径上都不要有中文。如下图所示。

     

     



           下面设置构建套件,因为我们下载的是Android版本的Qt,所以这里默认出现了两个构建套件,现在默认勾选了Desktop构建套件,这个是用来编译桌面版程序的,如下图所示。作为Qt学习的入门教程,我们暂时先使用桌面版应用进行讲解,所以这里保持默认设置,关于构建套件会在本篇教程后面讲到。直接单击“下一步”按钮。

     

     



           现在显示的是项目的类信息,如下图所示。这里的基类可选的有QMainWindow、QWidget和QDialog三个,关于这三个类会在后面的篇章中详细介绍,这里只要知道QMainWindow是一般桌面程序的主窗口即可。类名、头文件、源文件等都可以自定义名称,现在默认勾选了创建界面,这样可以使用设计器来设计主界面,这些内容建议都保持默认,直接单击“下一步”按钮。

     

     



           最后是项目管理界面,这里显示了源码目录和项目中自动添加的文件,还可以设置版本控制系统,不过,现在我们没有使用到,所以直接单击“完成”按钮完成项目创建。

     

     

     

    3.完成hello world项目

     

     

           创建完项目后会进入编辑模式,这里可以对项目文件进行查看和编辑。左侧是项目文件的列表,这里将项目中的文件分为了头文件、源文件、界面文件等进行分类显示。除了显示项目文件,还可以通过下拉菜单来选择类视图、大纲等内容。在右侧就是代码编辑区域,这里对关键字进行了高亮显示。如下图所示。

     

     



           单击上方的分栏图标,可以同时显示其他内容,比如这里选择显示“打开文档”和“文件系统”,如下图所示。

     

     




           这时会在项目文件列表下显示出已经打开的文档列表和文件系统,如下图所示。

     



           下面双击界面文件目录下的mainwindow.ui文件,进入设计模式。在这里可以对界面进行可视化设计,也就是所见即所得。左侧是一些常用部件,可以直接拖动到界面上;右侧上方是对象和类列表,下方是部件的属性编辑窗口;在中间,上方是主设计区域,显示了窗口的主界面,下方是Action编辑器以及信号和槽编辑器。

           我们从左侧部件列表中找到Label标签部件并拖动到界面上,然后双击,更改其显示文本为“helloworld”,如下图所示。

     

           下面单击Qt Creator左侧的运行按钮来编译运行程序,如果前面的文件没有保存,那么可能会弹出保存修改对话框,选中“构建之前总是先保存文件”,然后点击保存所有文件按钮即可,这样以后运行时都会自动保存未保存的文件。hello world程序运行效果如下图所示。

     

     

     

    三、发布程序

     

     

     

    1.查看项目目录

     

    这里会发现多了一个build-helloworld-Desktop_Qt_5_8_0_MinGW_32bit-Debug目录,里面存放的就是编译生成的文件。该目录的内容如下图所示。

    这里有两个目录:debug和release,因为编译时默认是debug版本,所以现在release目录中是空的。打开debug目录,可以看到生成的可执行文件helloworld.exe,如下图所示。

    此时双击helloworld.exe文件,会弹出系统错误提示框,提示丢失了Qt5Cored.dll文件。如下图所示。





    我们可以在Qt安装路径下找到该文件,我这里是在C:\Qt\Qt5.8.0\5.8\mingw53_32\bin中,将其复制到debug目录里面,然后还会提示缺少其他几个dll文件,依次将它们复制过来即可。完成后helloworld.exe就可以运行了。其实也可以先设置环境变量,以后在本机就可以直接运行生成的可执行文件了,这个可以参考下面的附录。



    2.编译release版本程序

     

     

    可以看到debug版本的可执行文件需要的dll文件很大,因为其中包含了调试信息。而实际发布软件是使用的release版本,下面就来编译release版本的helloworld程序。(PS: 如果前面关闭了Qt Creator,那么需要在Qt Creator中再次打开helloworld项目,可以从欢迎模式的开发页面中打开最近使用的项目,也可以从文件菜单中打开,还可以将源码目录中的.pro文件直接拖入到QtCreator来打开。)

    如下图所示,在左下角的目标选择器中设置为release版本,也就是发布版本。完成后运行程序即可。

     

     

    3.设置应用程序图标

     

    ///

           想要发布的程序有个漂亮的图标,操作非常简单,把要设置的ico图标放到源码目录,例如myico.ico文件,然后打开项目文件helloworld.pro,在最下面添加一行代码:

    RC_ICONS = myico.ico

           再次运行程序,可以看到窗口左上角出现了设置的图标,如下图所示。

     



    现在到build-helloworld-Desktop_Qt_5_8_0_MinGW_32bit-Release目录中的release目录,可以看到helloworld.exe已经使用了新的图标,可以将其复制到一个新建文件夹中,然后将需要的几个dll文件(跟debug版本的不是完全一样哦!)也复制过来,分别是Qt安装目录下bin目录中的libgcc_s_dw2-1.dll、libstdc++-6.dll、libwinpthread-1.dll、Qt5Core.dll、Qt5Gui.dll和Qt5Widgets.dll这6个文件,另外,还需要将C:\Qt\Qt5.8.0\5.8\mingw53_32\plugins目录中的platforms文件夹复制过来,里面只需要保留qwindows.dll文件即可,如下图所示。最后将该文件夹压缩打包即可发布。



    四、Qt工具介绍和附录

     

     

           安装好Qt后,会在开始菜单生成一个目录,如下图所示。

     



           这里是Qt提供的几个工具软件。其中Assistant是Qt助手,它已经集成到了QtCreator中,就是帮助模式;Designer是Qt设计师,它也集成到了Qt Creator中,就是设计模式; Linguist是Qt语言家,用来对软件进行国际化翻译;下面的Qt 5.8 for Desktop可以用来进行命令行操作,比如使用命令行来编译程序等。

     

     

    附录

     

     

    1、设置环境变量

     

     

           前面为了运行生成的helloworld.exe文件,复制了一些dll文件。其实,如果只想在本机运行程序,那么不必要每次都复制这些文件,只需要将path环境变量设置一下即可。我们在桌面计算机(我的电脑)图标上右击,选择属性,然后选择高级系统设置,在高级页面选择环境变量,然后在系统变量中找到Path变量,双击,在变量值的最后,添加上Qt的bin目录的路径,我这里是; C:\Qt\Qt5.8.0\5.8\mingw53_32\bin(注意,在最前面有个英文半角的分号)。如下图所示。

    //

     

     



           这样以后直接在本机运行exe文件就不需要再复制那些dll文件了。其实,还有一种方式也不需要dll文件,那就是静态编译,不过使用静态编译的Qt程序很大,而且不够灵活,所以这里不再讲解,有兴趣的朋友可以在网上搜索一下。

     

     

    2、构建套件

     

     

           打开Qt Creator,选择“工具→选项”菜单,在弹出的对话框左侧选择“构建和运行”,这时就可以看到现在已经有的构建套件(kit),如下图所示。其实,构建套件就是编译工具的集合,这里主要包括了套件名称、设备、编译器、调试器和Qt版本,这些都可以在这里进行选择和设置。现在安装的Qt 5的SDK都会默认将桌面版的构建套件设置好,从名称“Desktop Qt 5.8.0MinGW 32bit”就可以看出,现在使用的是5.8.0版本的Qt库和32位的MinGW编译器编译的桌面版程序。在Qt Versions页面,可以看到Android版的Qt库,只是因为现在还没有设置相应的工具,所以无法搭建构建套件,关于该部分内容,可以查看http://www.qter.org/portal.php?mod=view&aid=13这篇教程。

     

     

    展开全文
  • Qt5开发学习之Qt概述(一)

    万次阅读 2017-07-23 19:45:57
    起源 界面可能是每一个90后对于电脑的第一印象,透过屏幕看到多姿多彩的世界,从一个小小的窗口去触碰天空的边界,穿过界面到达梦想的彼岸。每一个程序员进入计算机的世界的理由各不相同,有人向往黑客世界中快速...
  • Qt 5.13版本正式发布(带下载链接)

    万次阅读 2019-06-27 10:28:47
    摘自Qt官网内容。快来看看新版本更新了些什么东西吧。
  • QT5.10开发(1)安装QT5.10

    万次阅读 2018-01-29 19:31:25
    一、QT软件下载 Qt 5.9 之后的安装包与之前相比,不再区分 VS 版本和 MinGW 版本,而是全都整合到了一个安装包中。因此,与之前的安装包相比,体积也是大了不少,以前是 1G 多,现在是 2G 多。 方式一、 ...
  • Qt5简介及Qt5基本框架

    万次阅读 2015-11-02 22:14:36
    使用Qt5.x版本中的不同方面来开发应用程序,着重于新的Qt Quick的技术,提供了编写C++后端的必要内容,并扩展了QtQuick。  本章提供了关于Qt5高层次的概述。它对开发者有效的展示了不同的应用模式并且使用Qt5对...
  • qt5官方文档

    2020-07-28 23:32:04
    2018年6月发布的最新Qt 5官方说明文档,想学QML的可以看看
  • Qt学习笔记(一):安装Qt5 + 配置VS2017

    万次阅读 热门讨论 2018-03-29 20:37:24
    注意版本:Qt5.10(Qt5.10和QtCreator4.5.2)和VS20171、下载你想要的QT版本https://www.qt.io/download下载免费版的即可,需要注册一个账号然后登陆后找到:https://account.qt.io/downloads2、QT5.10的安装及配置...
  • Qt 实战一二三》

    万次阅读 多人点赞 2020-03-28 18:53:52
    Qt 基础与实战,主要包含:环境搭建、信号槽、事件机制、数据类型、常用部件/布局、对话框、QPainter 绘图等内容。
  • Qt4与Qt5的区别

    万次阅读 2017-07-15 15:37:09
    把项目所需要的main.cpp加入项目中来,...注意:不知道你用的是Qt4还是Qt5,如果是5的话,在gotocell.pro文件中要加入QT += widgets这一行。项目才能编译。 Qt4写的程序如果要在Qt5中运行,需要在Pro文件中加入Qt
  • QT4项目移植到QT5项目的方法

    万次阅读 2013-02-03 01:00:55
    QT4项目在QT5中打开,常常会报告一些莫名奇妙的错误。QLabel,QApplication,QPushButton等常用的头文件都报告找不到。 到qt的安装目录中一看,却是存在的。这是怎么回事呢? 原来,QT5中很多常用的QT头文件都被移到...
  • Windows 8环境下,在QtCreator里运行Qt5程序,没有出现问题,但是在工程文件夹下的debug目录下,双击运行生成的.exe文件,却提示丢失Qt5Core.dll。 问题解决: 将Qt5Core.dll所在的目录添加到Windows系统环境变量...
  • Qt QtCreator 所有版本官方下载地址

    万次阅读 2018-02-03 14:00:59
    1.所有版本QT下载地址 :  http://download.qt.io/archive/qt/ 2. 所有Qt Creator下载地址: http://download.qt.io/archive/qtcreator/ 3. 所有Qt VS开发插件下载地址
  • Qt各版本官方下载地址

    万次阅读 2020-07-06 09:14:47
    记录下Qt各版本的下载地址,便于后期查找及下载 1. 所有Qt版本下载地址: http://download.qt.io/archive/qt/ 2. 所有Qt Creator下载地址: http://download.qt.io/archive/qtcreator/ 3. 所有Qt VS开发插件...
  • QT中出现以下情况时: 是没有相应的动态库文件,此时需要在Path变量下添加dll动态库的路径: (win7中的添加方法)——>——>——>——>(注意多个路径用“;”隔开) 我的QT路径是:;D:\QT5.0\5.2.0\msvc2010_...
  • 各种版本QT下载地址与VS2013+QT5.3.1环境搭建过程

    万次阅读 多人点赞 2017-01-17 20:29:44
    1. 所有Qt版本下载地址: http://download.qt.io/archive/qt/ 2. 所有Qt Creator下载地址: http://download.qt.io/archive/qtcreator/ 3. 所有Qt VS开发插件下载地址: http://download.qt.io/archive/vsaddin/...
1 2 3 4 5 ... 20
收藏数 343,607
精华内容 137,442
关键字:

qt5