一、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 url
TransProtocol trans_protocol : 0-udp, 1-tcp
int 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 _WIN32
INT rc;
WSADATA wsaData;
rc = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (rc) {
printf("WSAStartup Failed.\n");
return 1;
}
#endif
ws = 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 _WIN32
WSACleanup();
#endif
return 0;
}