zoukankan      html  css  js  c++  java
  • qt(一)

    一、Qt安装

    qt离线安装地址:http://download.qt.io/archive/qt/

    参考教程:https://blog.csdn.net/u013934107/article/details/80712418

    二、Qt环境搭建

    Qt官网:https://www.qt.io/

    1、工程目录下创建3rdparty文件夹,并将Qt的依赖库拷贝进去

     2、配置项目根目录的CMakeLists.txt文件,添加如下内容

    cmake_minimum_required(VERSION 3.15)
    project(qt_fuxi_day01)
    
    set(CMAKE_CXX_STANDARD 14)
    
    # 自动调用moc,uic,rcc处理qt的扩展部分
    set(CMAKE_AUTOMOC ON)# 信号和槽
    set(CMAKE_AUTOUIC ON)# ui
    set(CMAKE_AUTORCC ON)# 位置
    
    set(CMAKE_INCLUDE_CURRENT_DIR ON)
    
    # 设置find__xxx的路径 这种方法是把qt拷到项目中去
    #set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/qt)
    
    
    # 设置qt的全局路径
    set(G_PATH /home/kongws/Qt5.9.9/5.9.9/gcc_64/lib/cmake)
    
    # 找包,这里不关联动态库
    set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} ${G_PATH})
    #find_package(Qt5 COMPONENTS Widgets)
    
    # 设置find__xxx的路径
    #set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/qt)
    
    
    # qt config
    file(
            WRITE
            ${CMAKE_CURRENT_SOURCE_DIR}/build/bin/qt.conf
            "[Paths]
    #Prefix=../lib/Qt
    #Binaries=bin
    #Libraries=lib
    Plugins=${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/qt/plugins
    #Imports=imports
    #Qml2Imports=qml"
    )
    # 查找qt库
    find_package(Qt5Core REQUIRED)
    find_package(Qt5Gui REQUIRED)
    find_package(Qt5Widgets REQUIRED)
    find_package(Qt5OpenGL REQUIRED)
    find_package(Qt5Network REQUIRED)
    
    # 定义变量 保存so库
    SET(QT_LIBRARIES ${Qt5Core_LIBRARIES} ${Qt5Gui_LIBRARIES} ${Qt5Widgets_LIBRARIES} ${Qt5OpenGL_LIBRARIES}
            ${Qt5Network_LIBRARIES} ${Qt5Xml_LIBRARIES} ${Qt5Qml_LIBRARIES})
    # 头文件 路径
    include_directories(
            ${Qt5Core_INCLUDE_DIRS}
            ${Qt5Gui_INCLUDE_DIRS}
            ${Qt5Widgets_INCLUDE_DIRS}
            ${Qt5Network_INCLUDE_DIRS})
    
    #线程
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread -lpthread -Wl,--no-as-needed  -g3 -Wall")
    # 与位置无关
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
    
    #add_executable(qt_fuxi_day01 01_socket/main.cpp)
    add_subdirectory(01_socket)

    子文件夹下(名称:01_socket)的cmakelist:

    add_executable(main main.cpp)
    #add_executable(main_01 main_01.cpp ClientWindow.cpp ServerWindow.cpp)
    
    target_link_libraries(main ${QT_LIBRARIES})

    3、工程中链接Qt库

    add_executable(firstqt main.cpp)
    target_link_libraries(
            firstqt
            ${QT_LIBRARIES}
    )

    其中QT_LIBRARIES是配置好的Qt库的变量

    测试环境是否搭建好:

    #include <iostream>
    #include <QApplication>
    #include <QWidget>
    int main(int argc , char **argv) {
        QApplication qa(argc , argv);
    
    
        //创建窗口
        QWidget w;
        //显示窗口
        w.show();
    
        std::cout << "Hello, World!" << std::endl;
        return qa.exec();
    }

    三、 窗口和布局

    1. 添加窗口

    通常一个程序可能会有多个窗口,此时可以采用类的方式来定义窗口.

    • 定义窗口

    class MyWindow : public QWidget{
    public:
        MyWindow(){
            cout << "执行了窗口的构造" << endl;
            //创建按钮
            QPushButton *btn  = new QPushButton();
    
            //设置它的父亲是 这个窗口,也就是表示,它是窗口的一份子。
            btn->setParent(this);
        }
        ~MyWindow(){
            cout << "执行了窗口的析构" << endl;
        }
    };
    • 程序显示
    int main(int argc , char **argv) {
        QApplication qa(argc , argv);
    
        //创建窗口
        MyWindow w;
        //显示窗口
        w.show();
    
        std::cout << "Hello, World!" << std::endl;
        return qa.exec();
    }
    • 设置窗口图标、标题、大小
    class MyWindow : public QWidget{
    public:
        MyWindow(){
            cout << "执行了窗口的构造" << endl;
            //创建按钮
            QPushButton *btn  = new QPushButton("button" ,this);
            
            //设置窗口图标
            setWindowIcon(QIcon("../nlm_icon.jpg"));
    
            //设置窗口标题
            setWindowTitle(QString::fromLocal8Bit("中文"));
    
            //设置大小 允许拖拽
            resize(400,300);
        }
        ~MyWindow(){
            cout << "执行了窗口的析构" << endl;
        }
    };

    2. 基本UI

    记住一个核心: 所有的空间应该都依附于窗口里面。不要直接独立显示。

    • 按钮

    QPushButton *btn  = new QPushButton("button" ,this);
    • 文本

    显示中文,需要转化。

    //参数一: 内容, 参数二:表示父窗口是谁。
    QLabel *q  = new QLabel(QString::fromLocal8Bit("姓名: ") ,this );
    • 输入框
     QLineEdit *edit = new QLineEdit( this);
     edit->setPlaceholderText(QString::fromLocal8Bit("请输入姓名"));
    • 大小和位置
    //表示最大和最小的大小值,可以使用鼠标拖拽
    setMaximumSize(600,500);
    setMinimumSize(400,300);
    
    //设置固定大小 : 禁止放大和拖拽
    setFixedSize(100,50);
    
    //设置位置 从左往右:  x坐标, y的坐标   宽度和高度
    setGeometry(50 ,50 , 40,20);

    3. 布局

    在Qt里面布局分为四个大类 :QBoxLayout | QFormLayout | QGridLayout | QStackedLayout

    QBoxLayout : 直译为:盒子布局,快速构建的话,一般使用它的两个子类QHBoxLayout 和 QVBoxLayout 负责水平和垂直布局

    QGridLayout : 网格布局,有的人称之为九宫格布局

    QFormLayout: 一般适用于提交数据form表单。比如: 登录,注册类似的场景

    QStackedLayout : 提供了多页面切换的布局,一次只能看到一个界面。

    1. QBoxLayout

    • 示例

     

    • 示例代码

    下面的代码

    MyWindow(){
            cout << "执行了窗口的构造" << endl;
           //创建垂直布局
            QVBoxLayout *layout = new QVBoxLayout;
    
            //第一组单选组
            QGroupBox *box1 = new QGroupBox;
    
            //使用垂直布局包装
            QVBoxLayout *layout1 = new QVBoxLayout;
            QRadioButton *btn1 = new QRadioButton(QString::fromLocal8Bit("抽烟"));
            QRadioButton *btn2 = new QRadioButton(QString::fromLocal8Bit("喝酒"));
            QRadioButton *btn3 = new QRadioButton(QString::fromLocal8Bit("烫头"));
            layout1->addWidget(btn1);
            layout1->addWidget(btn2);
            layout1->addWidget(btn3);
    
            //把包装好的选项,放到groupBox中。
            box1->setLayout(layout1);
    
            //第二个单选组
            QGroupBox *box2 = new QGroupBox(QString::fromLocal8Bit("性别: "));
            QHBoxLayout *layout2 = new QHBoxLayout;
    
            QRadioButton *btn4 = new QRadioButton(QString::fromLocal8Bit(""));
            QRadioButton *btn5 = new QRadioButton(QString::fromLocal8Bit(""));
    
            layout2->addWidget(btn4);
            layout2->addWidget(btn5);
    
            //把包装好的选项,放到groupBox中。
            box2->setLayout(layout2);
    
            //把两组放到整体布局中
            layout->addWidget(box1);
            layout->addWidget(box2);
    
            //设置这个窗口的布局
            setLayout(layout);
        }

    2. QGridLayout

    class GridWnd : public QWidget{
    public:
        GridWnd(){
            QString strs{
                "7", "8", "9", "+", "(",
                "4", "5", "6", "-", ")",
                "1", "2", "3", "*", "<-",
                "0", ".", "=", "/", "C"
            };
    
            //整体垂直布局。
            QVBoxLayout *layout = new QVBoxLayout;
            //输入框
            QLineEdit *edit = new QLineEdit;
            layout->addWidget(edit);
    
            //网格布局
            QGridLayout *layout1 = new QGridLayout;
            for (int i = 0; i < strs.length(); ++i) {
                //循环一次,有一个按钮。
                QPushButton *btn = new QPushButton(strs[i]);
    
                //把这个按钮放置到某行某列去。
                layout1->addWidget(btn,i/5,i%5);
            }
    
            //追加到主布局中。
            layout->addLayout(layout1);
    
            //设置布局
            setLayout(layout);
        }
    };

    3. QToolBox

    class QToolWnd : public QWidget{
    public:
        QToolWnd(){
    
            //负责总的布局
            auto *layout = new QVBoxLayout;
    
            //负责做组切换
            auto *toolbox = new QToolBox;
    
            //使用QGroupBox 来包装垂直布局。
            QGroupBox *box1 = new QGroupBox;
    
            //用垂直布局,先包装三个同学。
            QVBoxLayout *cz  = new QVBoxLayout;
            QLabel * label1 = new QLabel(QString::fromLocal8Bit("张三"));
            QLabel * label2 = new QLabel(QString::fromLocal8Bit("李四"));
            QLabel * label3 = new QLabel(QString::fromLocal8Bit("王五"));
    
            cz->addWidget(label1);
            cz->addWidget(label2);
            cz->addWidget(label3);
            //使用box来包装垂直布局
            box1->setLayout(cz);
    
    
            QGroupBox *box2 = new QGroupBox;
            QVBoxLayout *hs  = new QVBoxLayout;
            QLabel * label4 = new QLabel(QString::fromLocal8Bit("刘备"));
            QLabel * label5 = new QLabel(QString::fromLocal8Bit("关羽"));
            QLabel * label6 = new QLabel(QString::fromLocal8Bit("张飞"));
    
            hs->addWidget(label4);
            hs->addWidget(label5);
            hs->addWidget(label6);
            //使用box来包装垂直布局
            box2->setLayout(hs);
    
    
            //最后把这一块放到选项组里面。
            toolbox->addItem( box1, QString::fromLocal8Bit("初中好友"));
            toolbox->addItem( box2, QString::fromLocal8Bit("高中好友"));
            
            //整体布局就一个工具盒
            layout->addWidget(toolbox);
            setLayout(layout);
        }
    };

    4. QTableWidget

    QTableWidget是QT程序中常用的显示数据表格的空间

    class QTableWnd : public QWidget{
    public:
        QTableWnd(){
    
            auto *table  = new QTableWidget(4,4,this);
    
            QStringList list{
                QString::fromLocal8Bit("姓名"),
                QString::fromLocal8Bit("年龄"),
                QString::fromLocal8Bit("成绩"),
                QString::fromLocal8Bit("性别"),
            };
            table->setHorizontalHeaderLabels(list);
    
            table->setFixedSize(500,300);
    
            QTableWidgetItem *item = new QTableWidgetItem(QString::fromLocal8Bit("张三"));
            QTableWidgetItem *item2 = new QTableWidgetItem(QString::fromLocal8Bit("18"));
            table->setItem(0 ,0 , item);
            table->setItem(0 ,1 , item2);
        }
    };

    4. 自定义UI

    除了系统定义好的控件之外,我们还可以在控件中绘制文字、图片以及不规则的几何图形到控件中

    可以在paintEvent方法中通过QPainter进行绘制

    • 绘制直线

    class QLineWnd : public QWidget{
        void paintEvent(QPaintEvent *event){
            QPainter * painter = new QPainter(this);
            
            QPen *p = new QPen(QColor(Qt::GlobalColor::red));
            painter->setPen(*p);
    
            painter->drawLine(100,100,200,200);
        }
    };
    • 绘制文字
    //绘制事件
    void MainWindow::paintEvent(QPaintEvent *event){
        //创建画家
        QPainter *painter = new QPainter(this);
        //画笔
        QPen *p = new QPen(QColor(Qt::GlobalColor::red));
        //替换画笔
        painter->setPen(*p);
    
        //绘制文字
        painter->drawText(300,300,"中国");
    }
    • 绘制矩形
    //绘制事件
    void MainWindow::paintEvent(QPaintEvent *event){
        //创建画家
        QPainter *painter = new QPainter(this);
        //画笔
        QPen *p = new QPen(QColor(Qt::GlobalColor::red));
        //替换画笔
        painter->setPen(*p);
    
        //绘制矩形
        painter->drawRect(50,50,200,200)
    }
    • 绘制扇形
    //绘制事件
    void MainWindow::paintEvent(QPaintEvent *event){
        //创建画家
        QPainter *painter = new QPainter(this);
        //画笔
        QPen *p = new QPen(QColor(Qt::GlobalColor::red));
        //替换画笔
        painter->setPen(*p);
    
        //绘制扇形
        /**
         * 参数1:矩形左上角x
         * 参数2:矩形左上角y
         * 参数3:矩形宽度
         * 参数4:矩形高度
         * 参数5:扇形开始角度
         * 参数6:扇形扫过的角度
         */
        painter->drawArc(300,300,100,100,0,30*16);
    }
    • 绘制圆形
    //绘制事件
    void MainWindow::paintEvent(QPaintEvent *event){
        //创建画家
        QPainter *painter = new QPainter(this);
        //画笔
        QPen *p = new QPen(QColor(Qt::GlobalColor::red));
        //替换画笔
        painter->setPen(*p);
    
        //绘制圆形
        painter->drawEllipse(200,200,100,100);
    }
    • 绘制多边形
    //绘制事件
    void MainWindow::paintEvent(QPaintEvent *event){
        //创建画家
        QPainter *painter = new QPainter(this);
        //画笔
        QPen *p = new QPen(QColor(Qt::GlobalColor::red));
        //替换画笔
        painter->setPen(*p);
    
        QPoint point1(100,100);
        QPoint point2(100,150);
        QPoint point3(150,100);
        QPoint point4(150,200);
        QPoint point5(100,100);
    
        QPoint arr[] = {point1,point2,point3,point4,point5};
        //绘制多边形
        painter->drawConvexPolygon(arr,4);
    }
  • 相关阅读:
    万豪酒店数据库遭入侵 5亿顾客信息或泄露
    网络信息安全中最热门的果然是它
    有奖问卷调查丨你有意见?可以提啊!
    业务逻辑漏洞探索之绕过验证
    一个月薪两万的Web安全工程师要掌握哪些技能?
    phpcms2008远程代码执行漏洞
    BASE64编码原理分析脚本实现及逆向案例
    源码级调试的XNU内核
    使用RSA加密在Python中逆向shell
    感恩节活动中奖名单 i春秋喊你领礼物啦!
  • 原文地址:https://www.cnblogs.com/kongweisi/p/13423765.html
Copyright © 2011-2022 走看看