Giter Club home page Giter Club logo

qtexamples's Introduction

                          我也不知道为什么,当初就是想放这么一张图在这里~

QtExamples


[TOC]


目录


项目介绍

  • QtGUI 基础控件用法,网络;

  • DTK 重绘控件方式的框架解析;

  • QtCrator 使用和一些小技巧;

  • Qt 原理/运行机制理解

  自己所学记录,亦可以互相交流共享学习,有朋自远方互联网而来,不亦悦乎?


构建环境

该系列的源码,知识文章等均托管于此仓库;主线目标是讲解 QT5 的相关文章。

开发系统: MacOS 10.14-13.x | win10 x64 1803-22H2, Win11+ | UOS/Deepin 20-23.x

编码软件: Qt 5.9-5.15 | Visual Studio 2015-2022


热门作品

较火 / 高规格的完整项目 🔥🔥🔥 【属第10章】



正文

「第 1 章」 预备知识



「第 2 章」 QT 生成原理/运行机制


「第 3 章」 常规 GUI 控件

原生控件

高级自绘和组合控件


「第 4 章」 网络编程


「第 5 章」 DTK 重绘控件原理解析 / 自定义 QStyle


「第 6 章」 QT / IDE 乱码根因和解决


「第 7 章」 IDE 技巧


「第 8 章」 提交规范和发布 QT 程序

上架 App Store


「第 9 章」 高级


「第 10 章」 项目 / 商业级别

软件

硬件


「第 11 章」 经验总结


新手过来

  新手 在深思熟虑后踏入的编程,容易遭遇如下如下几点:

  1. 语言语法不熟悉🤦‍♀️
  2. 相关 IDE 安装、配置不会;不懂如何创建自己所需的工程项目🤦‍♀️
  3. 基础控件不认识,不会用🤦‍♀️
  4. 难以🔍可阅读、成体系的低级博客,多为高热度Title文章🤦‍♀️
  5. ...开始步入正轨👣
  6. 也不知学编程到是底在学习什么❓👀
  7. ...修行靠个人👩‍💻

分享所想

  1. 自己想学一遍 GUI 控件
  2. 帮助真的新手实现0→1的入门,解决👆的1,2,3,4,6问题
  3. 学习于网络,回馈于网络
  4. 希望永久被🔍引擎检索到,以博客形式发表📝

Star 增长

Star History Chart


我所想说🙋‍♀️

虽然不盈利,会累,但因自由和开源软件而写的开心ya, 鸭鸭


贡献

若是帮助到了你,或者觉得有用,可以点击该项目的的 ⭐Star🍴 Fork 的两个图标,方便抬手之间,表示点个赞,手有余香

当然也可以赠与一杯冰阔落[捐赠/打赏 ← 点击展开二维码]

- If you have something to learn from the project, you can also invite me to share a glass of Fat House Ice and Coke. -


作者

alt text : 直接和我聊天~

alt text : 查看我的主页

alt text : 好奇我的小窝

alt text :浏览量 100W+


协议

博客代码基于Apache License 2.0 协议进行分发和使用,更多信息参见 协议文件

所含文章使用以下协议进行保护:署名-非商业性使用-禁止演绎

qtexamples's People

Contributors

chungzh avatar xmuli avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

qtexamples's Issues

QMediaPlayer::setVideoOutput() cause QOpenGLWidget can't to display

Environment

  1. OS: Ubuntu 20.04LTS
  2. Qt-Version: 5.12.8

Target

I have two Forms in my system,the first is QOpenGLWidget(override) to play video, and the Second with some QVideoWidget(override) -s to play video in video-recorder.

Problem

When the first form is playing Video,I show the second form.And the first form can not display the video.I found this code QMediaPlayer::setVideoOutput(ui->videoWidget) caused the problem.

System interface and operation process

Code

QOpenGLWidget(override)

#ifndef QMYOPENGLWIDGET_H
#define QMYOPENGLWIDGET_H

#include <QOpenGLWidget>

class QMyOpenGLWidget : public QOpenGLWidget
{
    Q_OBJECT
public:
    explicit QMyOpenGLWidget(QWidget *parent = nullptr);

public:
    void setImgData(uchar *data, int width, int height);

protected:
    // QOpenGLWidget interface
    void initializeGL() override;
    void resizeGL(int w, int h) override;
    void paintGL() override;


private:
    enum {
        Left_Bottom_X,
        Left_Bottom_Y,
        Right_Bottom_X,
        Right_Bottom_Y,
        Right_Top_X,
        Right_Top_Y,
        Left_Top_X,
        Left_Top_Y,
        Pos_Max
    };
    uchar *imageData_ = nullptr;//图像信息
    QSize imageSize_;

    GLuint textureId_;          //纹理ID
    QSize Ortho2DSize_;         //窗口尺寸
    int vertexPos_[Pos_Max];     //窗口坐标
    float texturePos_[Pos_Max];  //纹理坐标
};

//source file
#include "QMyOpenGLWidget.h"

QMyOpenGLWidget::QMyOpenGLWidget(QWidget *parent) : QOpenGLWidget(parent)
{
    imageData_ = nullptr;
}

//设置图像的rgb数据和长宽数据
void QMyOpenGLWidget::setImgData(uchar *data, int width, int height)
{
    this->imageData_ = data;
    this->imageSize_.setWidth(width);
    this->imageSize_.setHeight(height);
}

void QMyOpenGLWidget::initializeGL()
{
    // 生成一个纹理ID
    glGenTextures(1, &textureId_);
    // 绑定该纹理ID到二维纹理上
    glBindTexture(GL_TEXTURE_2D, textureId_);
    // 用线性插值实现图像缩放
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
}

void QMyOpenGLWidget::resizeGL(int w, int h)
{
    Ortho2DSize_.setWidth(w);
    Ortho2DSize_.setHeight(h);
    glViewport(0, 0, w, h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, Ortho2DSize_.width(), Ortho2DSize_.height(), 0, -1, 1);
    glMatrixMode(GL_MODELVIEW);
}

void QMyOpenGLWidget::paintGL()
{
//    QPainter painter;//this way also cause the problem

//    painter.begin(this);

//    QImage img = QImage(imageData_, imageSize_.width(), imageSize_.height(), QImage::Format_RGB888);
//    img = img.scaled(this->width(), this->height());
//    painter.drawImage(this->geometry(), img);
//    painter.end();

    // 设置背景颜色
    glClearColor(1.0f, 1.0f, 1.0f, 1.0f);//白色
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//清理颜色和位深使设置的颜色生效

    if (imageData_ == nullptr) {
        return;
    }

    glBindTexture(GL_TEXTURE_2D, textureId_);
    // 使用图像数据生成纹理
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, imageSize_.width(), imageSize_.height(), 0, GL_RGB, GL_UNSIGNED_BYTE, imageData_);


    // 顶点坐标保存的是相对于窗口的位置,由于不需要保持视频长宽比例,
    vertexPos_[Left_Bottom_X] = 0;
    vertexPos_[Left_Bottom_Y] = 0;
    vertexPos_[Right_Bottom_X] = Ortho2DSize_.width();
    vertexPos_[Right_Bottom_Y] = 0;
    vertexPos_[Right_Top_X] = Ortho2DSize_.width();
    vertexPos_[Right_Top_Y] = Ortho2DSize_.height();
    vertexPos_[Left_Top_X] = 0;
    vertexPos_[Left_Top_Y] = Ortho2DSize_.height();

    // 纹理坐标点保存的是相对于图片的位置
    texturePos_[Left_Bottom_X] = 0.0f;
    texturePos_[Left_Bottom_Y] = 0.0f;
    texturePos_[Right_Bottom_X] = 1.0f;
    texturePos_[Right_Bottom_Y] = 0.0f;
    texturePos_[Right_Top_X] = 1.0f;
    texturePos_[Right_Top_Y] = 1.0f;
    texturePos_[Left_Top_X] = 0.0f;
    texturePos_[Left_Top_Y] = 1.0f;

    glEnable(GL_TEXTURE_2D);
    glBegin(GL_POLYGON);
    glTexCoord2d(texturePos_[Left_Bottom_X], texturePos_[Left_Bottom_Y]);
    glVertex2d(vertexPos_[Left_Bottom_X], vertexPos_[Left_Bottom_Y]);
    glTexCoord2d(texturePos_[Left_Top_X], texturePos_[Left_Top_Y]);
    glVertex2d(vertexPos_[Left_Top_X], vertexPos_[Left_Top_Y]);

    glTexCoord2d(texturePos_[Right_Top_X], texturePos_[Right_Top_Y]);
    glVertex2d(vertexPos_[Right_Top_X], vertexPos_[Right_Top_Y]);
    glTexCoord2d(texturePos_[Right_Bottom_X], texturePos_[Right_Bottom_Y]);
    glVertex2d(vertexPos_[Right_Bottom_X], vertexPos_[Right_Bottom_Y]);
    glEnd();
    glDisable(GL_TEXTURE_2D);
}

#endif // QMYOPENGLWIDGET_H

QVideoWidget(override)

//head file
#ifndef QMYVIDEOWIDGET_H
#define QMYVIDEOWIDGET_H

#include <QVideoWidget>

class QMyVideoWidget : public QVideoWidget
{
    Q_OBJECT
public:
    explicit QMyVideoWidget(QWidget *parent = nullptr);


};

// source file
#include "QMyVideoWidget.h"

QMyVideoWidget::QMyVideoWidget(QWidget *parent) : QVideoWidget(parent)
{

}

#endif // QMYVIDEOWIDGET_H

fix typo

仓库描述的 QtCrator 应改为 QtCreator

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.