一、QT 之 QTreeWidget 树形控件
Qt编程指南,Qt新手教程,Qt Programming Guide
一个树形结构的节点中的图表文本 、附带数据的添加:
QTreeWidgetItem* TourTreeWnd::InsertNode(NetNodeInfo node, QTreeWidgetItem* parent_item)
{ // 创建一个QVariant对象,用于存储NetNodeInfo类型的node QVariant var; var.setValue(node); // 初始化一个指向QTreeWidgetItem的指针,用于存储新创建的节点 QTreeWidgetItem* Item = NULL; // 检查parent_item是否为NULL,如果是,则表示要插入的节点是顶级节点 if (parent_item == NULL) { // 为顶级节点创建一个新的QTreeWidgetItem对象 Item = new QTreeWidgetItem(m_tree.get()); // 设置新节点的第一个列的文本为node的Name属性 Item->setText(0, (QString)node.Name); // 设置新节点的第一个列的工具提示与文本相同 Item->setToolTip(0, Item->text(0)); // 将新节点作为顶级节点添加到树形控件中 m_tree->addTopLevelItem(Item); // 根据node的类型设置图标 // 如果节点类型是NodeType_TOURTASK,则使用特定类型的图标 if (node.Type == NodeType::NodeType_TOURTASK) { Item->setIcon(0, QIcon(GetIconByNodetype(node.Type))); } // 注意:这里没有处理非NodeType_TOURTASK类型顶级节点的图标设置,可能是个遗漏 // 将QVariant对象var作为用户自定义数据存储在节点的第一个列上 Item->setData(0, Qt::UserRole, var); // 设置节点第一个列的大小提示为30x30 Item->setSizeHint(0, QSize(30, 30)); } // 如果parent_item不为NULL,则表示要插入的节点是子节点 else { // 为子节点创建一个新的QTreeWidgetItem对象,并指定parent_item为其父节点 Item = new QTreeWidgetItem(parent_item); // 设置子节点的大小提示为30x30 Item->setSizeHint(0, QSize(30, 30)); // 设置子节点的第一个列的文本为node的Name属性 Item->setText(0, (QString)node.Name); // 设置子节点的第一个列的工具提示与文本相同 Item->setToolTip(0, Item->text(0)); // 根据node的类型或设备状态设置图标 // 如果节点类型是NodeType_DEVICE,则根据设备主类型、子类型和状态获取图标 if (node.Type == NodeType::NodeType_DEVICE) { Item->setIcon(0, QIcon(GetIconByDevStatus(node.DevMainType, node.DevSubType, node.Status))); } // 如果不是NodeType_DEVICE类型,则根据节点类型获取图标 else { Item->setIcon(0, QIcon(GetIconByNodetype(node.Type))); } // 将QVariant对象var作为用户自定义数据存储在节点的第一个列上 Item->setData(0, Qt::UserRole, var); } // 显示树形控件(通常不是必需的,因为可能在其他地方已经设置为可见) m_tree->show(); // 展开树形控件中的所有节点,以便新插入的节点可见 m_tree->expandAll(); // 返回新创建的节点指针,以便调用者可以使用它 return Item;
}
其中注意以下几点:
二、视频播放
1. 主辅码流区别
2. RTSP
3. SDK的调用案例:
#pragma once#include <memory>
#ifdef _WINDOWS
#include <Windows.h>
#ifdef LIBRTSPCLINET_SDK_EXPORTS
#define LIBRTSPCLINET_API __declspec(dllexport)
#else
#define LIBRTSPCLINET_API __declspec(dllimport)
#endif
#else
#define LIBRTSPCLINET_API
#endif#include "Common.h"using namespace std;class LIBRTSPCLINET_API LibRtspClientManager
{
public:static LibRtspClientManager& getInstance() {static LibRtspClientManager instance;return instance;}/* @ 初始化SDK:@ 参数:onLibRtspClientDateCB 数据回调函数地址onLibRtspClientMsgCB 消息回调函数地址@ 返回: bool*/bool Init();/* @ 反初始化SDK:@ 参数:@ 返回: void*/void UnInit();/* @ 创建RTSP Client:@ 参数:std::string url : rtsp urlTransProtocol trans_protocol : 0-udp, 1-tcpint timeout : 超时时间,单位秒@ 返回: int32_t rtsp session id*/uint32_t CreateRtspClient(std::string url,std::string username, std::string password,TransProtocol trans_protocol, RtspCallBack* callback, int timeout);bool ReleaseRtspClient(uint32_t session_id);/* @ 连接服务器* @ 异步通知,rtsp连接情况在onLibRtspClientMsgCB反馈*/bool Connect(uint32_t session_id);bool Play(uint32_t session_id, std::string params_json);bool Control(uint32_t session_id, std::string params_json);bool Pause(uint32_t session_id);// 恢复播放bool Resume(uint32_t session_id);// 从指定位置恢复播放bool Resume(uint32_t session_id, float npt);bool Stop(uint32_t session_id);void WaitForStop(uint32_t session_id);
private:LibRtspClientManager();virtual ~LibRtspClientManager();class LibRtspClientPriv;std::shared_ptr<LibRtspClientPriv> m_priv;
};
4. 一个webSocket第三方库;easywsclient.hpp easywsclient.cpp
Easywsclient: 强大且简单的C++ WebSocket客户端库-CSDN博客
下文代码摘自gitcode.com中:
#include "easywsclient.hpp"
//#include "easywsclient.cpp" // <-- include only if you don't want compile separately
#ifdef _WIN32
#pragma comment( lib, "ws2_32" )
#include <WinSock2.h>
#endif
#include <assert.h>
#include <stdio.h>
#include <string>using easywsclient::WebSocket;
static WebSocket::pointer ws = NULL;void handle_message(const std::string & message)
{printf(">>> %s\n", message.c_str());if (message == "world") { ws->close(); }
}int main()
{
#ifdef _WIN32INT rc;WSADATA wsaData;rc = WSAStartup(MAKEWORD(2, 2), &wsaData);if (rc) {printf("WSAStartup Failed.\n");return 1;}
#endifws = WebSocket::from_url("ws://localhost:8126/foo");assert(ws);ws->send("goodbye");ws->send("hello");while (ws->getReadyState() != WebSocket::CLOSED) {ws->poll();ws->dispatch(handle_message);}delete ws;
#ifdef _WIN32WSACleanup();
#endifreturn 0;
}