feat: 四宫格视频窗口

chen^2
cbwu 3 weeks ago
parent 1687e9950f
commit 8e2d490d30

@ -9,6 +9,7 @@ qt_add_executable(VideoClient
global.h global.cpp
communicationsettingdlg.h communicationsettingdlg.cpp communicationsettingdlg.ui
commandwidget.h commandwidget.cpp commandwidget.ui
streamaddrsettingsdlg.h streamaddrsettingsdlg.cpp streamaddrsettingsdlg.ui
)
qt6_add_resources(VideoClient "resources"

@ -92,7 +92,10 @@ void CommunicationSettingDlg::on_saveSettingBtn_clicked() {
}
// 保存配置参数
if (!g_networkSettingInfo) return;
if (!g_networkSettingInfo) {
this->close();
return;
};
g_networkSettingInfo->setValue("DataSource", dataType);
QString groupName = "";
switch (dataType) {
@ -119,4 +122,5 @@ void CommunicationSettingDlg::on_saveSettingBtn_clicked() {
ui->saveSettingBtn->setDisabled(false);
emit sendErrorMessage("保存成功!", 1);
this->close();
}

@ -42,4 +42,158 @@ bool isMulticastAddress(const QString& ip) {
return false;
}
/**
* @brief calCRC16
* @param cpu8Data
* @param u16Len
* @return
*/
uint16_t calCRC16(const uint8_t* cpu8Data, uint16_t u16Len) {
uint8_t u8X;
uint16_t u16CRC = 0X8848;
while (u16Len--) {
u8X = u16CRC >> 8 ^ *cpu8Data++;
u8X ^= u8X >> 4;
u16CRC = (u16CRC << 8) ^ ((uint16_t)(u8X << 12)) ^
((uint16_t)(u8X << 5)) ^ ((uint16_t)u8X);
}
return u16CRC;
}
/**
* @brief MD5
* @param str
* @return MD5
*/
QString calculateMD5(const QString& str) {
QByteArray hash =
QCryptographicHash::hash(str.toUtf8(), QCryptographicHash::Md5);
return hash.toHex();
}
/**
* @brief
* @param uavID: ID
* @param uavName: 981cs
* @param clientID: ID01
* @param pushDomain:
* @param appName: app
* @param expireTime: 1h
* @return
*/
QString generatePushURL(int uavID, QString appName, QString pushKey,
QString uavName, int clientID, QString pushDomain,
long expireTime) {
QString clientName = "";
if (0 == clientID) {
clientName = "gcs"; // 地面端
} else {
clientName = "uav"; // 载荷端
}
QString streamName =
uavName + "_" + QString::number(uavID) + "_" + clientName;
QString pushURL = "";
if (pushKey == "") {
pushURL = "rtmp://" + pushDomain + "/" + appName + "/" + streamName;
} else {
// 计算鉴权串
long timeStamp =
QDateTime::currentMSecsSinceEpoch() / 1000 + expireTime;
QString stringToMd5 = "/" + appName + "/" + streamName + "-" +
QString::number(timeStamp) + "-0-0-" + pushKey;
QString authKey = calculateMD5(stringToMd5);
pushURL = "rtmp://" + pushDomain + "/" + appName + "/" + streamName +
"?auth_key=" + QString::number(timeStamp) + "-0-0-" + authKey;
}
return pushURL;
}
std::map<int, std::string> g_mapAppName;
/**
* @brief
* @param uavID: ID
* @param appName: app
* @param uavName: 981cs
* @param clientID: ID01
* @param pullDomain:
* @param expireTime: 1h
* @param pullKey: Key
* @return
*/
QString generatePullURL(int uavID, QString appName, QString pullKey,
QString uavName, int clientID, QString pullDomain,
long expireTime) {
QString rtmpUrl = "";
QString clientName = "";
if (0 == clientID) {
clientName = "gcs"; // 地面端
} else {
clientName = "uav"; // 载荷端
}
QString streamName =
uavName + "_" + QString::number(uavID) + "_" + clientName;
if (pullKey == "") {
rtmpUrl = "rtmp://" + pullDomain + "/" + appName + "/" + streamName;
} else {
// 计算鉴权串
long timeStamp =
QDateTime::currentMSecsSinceEpoch() / 1000 + expireTime;
QString stringToMd5 = "/" + appName + "/" + streamName + "-" +
QString::number(timeStamp) + "-0-0-" + pullKey;
QString authKey = calculateMD5(stringToMd5);
rtmpUrl = "rtmp://" + pullDomain + "/" + appName + "/" + streamName +
"?auth_key=" + QString::number(timeStamp) + "-0-0-" + authKey;
}
return rtmpUrl;
}
/**
* @brief
* @param uavID:ID
* @param appName:
* @param uavName:981cs
* @return
*/
QString generatePushURL2(int uavID, QString appName, QString uavName,
int clientID, QString pushDomain) {
QString rtmpUrl = "";
QString clientName = "";
if (0 == clientID) {
clientName = "gcs"; // 地面端
} else {
clientName = "uav"; // 载荷端
}
QString streamName =
uavName + "_" + QString::number(uavID) + "_" + clientName;
rtmpUrl = "rtmp://" + pushDomain + "/" + appName + "/" + streamName;
return rtmpUrl;
}
/**
* @brief
* @param uavID: ID
* @param appName: app
* @param uavName: 981cs
* @param clientID: ID01
* @param pullDomain:
* @return
*/
QString generatePullURL2(int uavID, QString appName, QString uavName,
int clientID, QString pullDomain) {
QString clientName = "";
if (0 == clientID) {
clientName = "gcs"; // 地面端
} else {
clientName = "uav"; // 载荷端
}
QString streamName =
uavName + "_" + QString::number(uavID) + "_" + clientName;
QString pushURL = "";
pushURL = "rtsp://" + pullDomain + "/" + appName + "/" + streamName;
return pushURL;
}
Global::Global() {}

@ -1,6 +1,8 @@
#ifndef GLOBAL_H
#define GLOBAL_H
#include <QCryptographicHash>
#include <QDateTime>
#include <QHostAddress>
#include <QHostInfo>
#include <QList>
@ -33,6 +35,81 @@ struct NetworkIPStruct {
// NOTIFICATION_WARNING = 3
// };
/**
* @brief calCRC16
* @param cpu8Data
* @param u16Len
* @return
*/
extern uint16_t calCRC16(const uint8_t* cpu8Data, uint16_t u16Len);
/**
* @brief MD5
* @param str
* @return MD5
*/
extern QString calculateMD5(const QString& str);
/**
* @brief
* @param uavID: ID
* @param uavName: 981cs
* @param clientID: ID01
* @param pushDomain:
* @param appName
* @param expireTime: 1h
* @param pushKey: Key
* @return
*/
extern QString generatePushURL(int uavID, QString appName = "nmyj",
QString pushKey = "ZRjGVcPYGhKib0rdgH",
QString uavName = "981cs", int clientID = 0,
QString pushDomain = "push.uavideo.cn",
long expireTime = 6 * 3600);
/**
* @brief
* @param uavID:ID
* @param clientID: ID01
* @param appName:
* @param uavName:981cs
* @param pushDomain:
* @return
*/
extern QString generatePushURL2(int uavID, QString appName = "nmyj",
QString uavName = "981cs", int clientID = 0,
QString pushDomain = "182.92.130.23");
/**
* @brief
* @param uavID: ID
* @param appName: app
* @param uavName: 981cs
* @param clientID: ID01
* @param pullDomain:
* @param expireTime: 1h
* @param pullKey: Key
* @return
*/
extern QString generatePullURL(int uavID, QString appName = "nmyj",
QString pullKey = "HDaMVkLnIcr0mGhV8d",
QString uavName = "981cs", int clientID = 0,
QString pullDomain = "play.uavideo.cn",
long expireTime = 6 * 3600);
/**
* @brief
* @param uavID: ID
* @param appName: app
* @param uavName: 981cs
* @param clientID: ID01
* @param pullDomain:
* @return
*/
extern QString generatePullURL2(int uavID, QString appName = "nmyj",
QString uavName = "981cs", int clientID = 0,
QString pullDomain = "182.92.130.23");
class Global {
public:
Global();

@ -49,13 +49,19 @@ MainWindow::MainWindow(QWidget *parent)
file.open(QIODevice::WriteOnly);
file.close();
}
g_networkSettingInfo =
new QSettings("networkSettingInfo.ini", QSettings::IniFormat);
initSignalConnection();
initNotifyManager();
initNotifyMessageConnection();
setSavedVideoDir();
// ui->stackedWidget->setCurrentIndex(1);
// ui->videoWidget1->play(list.at(0));
// ui->videoWidget2->play(list.at(0));
// ui->videoWidget3->play(list.at(0));
// ui->videoWidget4->play(list.at(0));
}
MainWindow::~MainWindow() {
@ -111,6 +117,31 @@ void MainWindow::installWindowAgent() {
windowAgent = new QWK::WidgetWindowAgent(this);
windowAgent->setup(this);
auto menuBar = new QMenuBar(this);
// QMenu *settingmenu =
// menuBar->addMenu(QIcon(":/images/settings1.png"), "设置");
QAction *settingAction = new QAction(this);
settingAction->setIcon(QIcon(":/images/settings1.png"));
settingAction->setIconText("设置");
menuBar->addAction(settingAction);
connect(settingAction, &QAction::triggered, this,
&MainWindow::showSettingDlgSlot);
QAction *playBackAction = new QAction(this);
playBackAction->setIcon(QIcon(":/images/playback.png"));
playBackAction->setIconText("回放");
menuBar->addAction(playBackAction);
QAction *pushStreamAction = new QAction(this);
pushStreamAction->setIcon(QIcon(":/images/pushstream.png"));
pushStreamAction->setIconText("推流");
menuBar->addAction(pushStreamAction);
connect(pushStreamAction, &QAction::triggered, this,
&MainWindow::showStreamSettingsDlgSlot);
menuBar->setObjectName(QStringLiteral("win-menu-bar"));
auto titleLabel = new QLabel();
titleLabel->setAlignment(Qt::AlignCenter);
titleLabel->setObjectName(QStringLiteral("win-title-label"));
@ -152,7 +183,7 @@ void MainWindow::installWindowAgent() {
windowBar->setMaxButton(maxButton);
windowBar->setCloseButton(closeButton);
#endif
// windowBar->setMenuBar(menuBar);
windowBar->setMenuBar(menuBar);
windowBar->setTitleLabel(titleLabel);
windowBar->setHostWidget(this);
@ -164,6 +195,7 @@ void MainWindow::installWindowAgent() {
windowAgent->setSystemButton(QWK::WindowAgentBase::Maximize, maxButton);
windowAgent->setSystemButton(QWK::WindowAgentBase::Close, closeButton);
#endif
windowAgent->setHitTestVisible(menuBar, true);
#ifdef Q_OS_MAC
windowAgent->setSystemButtonAreaCallback([](const QSize &size) {
@ -217,3 +249,24 @@ void MainWindow::loadStyleSheet(Theme theme) {
Q_EMIT themeChanged();
}
}
void MainWindow::setSavedVideoDir() {
ui->videoWidget->setVedioSaveFileDirPath("./video/main");
ui->videoWidget1->setVedioSaveFileDirPath("./video/video1");
ui->videoWidget2->setVedioSaveFileDirPath("./video/video2");
ui->videoWidget3->setVedioSaveFileDirPath("./video/video3");
ui->videoWidget4->setVedioSaveFileDirPath("./video/video4");
}
void MainWindow::showSettingDlgSlot() {
settingDlg.exec();
}
void MainWindow::showStreamSettingsDlgSlot() {
streamAddrSettingsDlg.exec();
}
void MainWindow::changeVideoLayout(int index)
{
}

@ -7,7 +7,10 @@
#include "NotifyManager.h"
#include "commandwidget.h"
#include "communicationsettingdlg.h"
#include "global.h"
#include "streamaddrsettingsdlg.h"
#include "videowidget.h"
#ifdef Q_OS_WIN
#include "windows.h"
@ -53,9 +56,17 @@ private:
void installWindowAgent();
void loadStyleSheet(Theme theme);
void setSavedVideoDir();
private slots:
void showSettingDlgSlot();
void showStreamSettingsDlgSlot();
void changeVideoLayout(int index);
private:
Ui::MainWindow *ui;
VideoWidget *videoWidget1 = nullptr;
CommunicationSettingDlg settingDlg;
StreamAddrSettingsDlg streamAddrSettingsDlg;
QWK::WidgetWindowAgent *windowAgent;
Theme currentTheme{};
NotifyManager *m_notifyManager = nullptr;

@ -14,22 +14,83 @@
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralwidget">
<layout class="QVBoxLayout" name="verticalLayout" stretch="6,1">
<layout class="QVBoxLayout" name="verticalLayout_3">
<property name="leftMargin">
<number>0</number>
<number>2</number>
</property>
<property name="topMargin">
<number>0</number>
<number>2</number>
</property>
<property name="rightMargin">
<number>0</number>
<number>2</number>
</property>
<property name="bottomMargin">
<number>0</number>
<number>2</number>
</property>
<item>
<widget class="QStackedWidget" name="stackedWidget">
<widget class="QWidget" name="page">
<layout class="QVBoxLayout" name="verticalLayout_2">
<property name="spacing">
<number>2</number>
</property>
<property name="leftMargin">
<number>2</number>
</property>
<property name="topMargin">
<number>2</number>
</property>
<property name="rightMargin">
<number>2</number>
</property>
<property name="bottomMargin">
<number>2</number>
</property>
<item>
<widget class="VideoWidget" name="videoWidget"/>
</item>
</layout>
</widget>
<widget class="QWidget" name="page_2">
<layout class="QVBoxLayout" name="verticalLayout">
<property name="spacing">
<number>2</number>
</property>
<property name="leftMargin">
<number>2</number>
</property>
<property name="topMargin">
<number>2</number>
</property>
<property name="rightMargin">
<number>2</number>
</property>
<property name="bottomMargin">
<number>2</number>
</property>
<item>
<layout class="QGridLayout" name="gridLayout">
<property name="spacing">
<number>2</number>
</property>
<item row="0" column="0">
<widget class="VideoWidget" name="videoWidget1"/>
</item>
<item row="0" column="1">
<widget class="VideoWidget" name="videoWidget2"/>
</item>
<item row="1" column="0">
<widget class="VideoWidget" name="videoWidget3"/>
</item>
<item row="1" column="1">
<widget class="VideoWidget" name="videoWidget4"/>
</item>
</layout>
</item>
</layout>
</widget>
</widget>
</item>
<item>
<widget class="CommandWidget" name="commandWidget" native="true"/>
</item>

Binary file not shown.

After

Width:  |  Height:  |  Size: 809 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 522 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 801 B

@ -20,5 +20,10 @@
<file>window-bar/minimize.svg</file>
<file>window-bar/more-line.svg</file>
<file>window-bar/restore.svg</file>
<file>images/pushstream.png</file>
<file>images/settings1.png</file>
<file>images/playback.png</file>
<file>images/videolayout1.png</file>
<file>images/videolayout4.png</file>
</qresource>
</RCC>

@ -0,0 +1,107 @@
#include "streamaddrsettingsdlg.h"
#include "ui_streamaddrsettingsdlg.h"
StreamAddrSettingsDlg::StreamAddrSettingsDlg(QWidget *parent)
: QDialog(parent), ui(new Ui::StreamAddrSettingsDlg) {
ui->setupUi(this);
this->setWindowTitle(QStringLiteral("视频流设置"));
// 飞机类型
QStringList uavTypeList;
uavTypeList.append("FP98");
uavTypeList.append("FP985");
uavTypeList.append("FP981C");
uavTypeList.append("FP981CS");
uavTypeList.append("FP981A");
ui->uavTypeCombox->insertItems(0, uavTypeList);
//
ui->pushStreamIPCombox->insertItem(0, QStringLiteral("航天飞鹏服务器"));
ui->pushStreamIPCombox->insertItem(1,
QStringLiteral("航天飞鹏阿里云服务器"));
ui->pushStreamIPCombox->insertItem(2, QStringLiteral("自定义"));
}
StreamAddrSettingsDlg::~StreamAddrSettingsDlg() {
delete ui;
}
void StreamAddrSettingsDlg::showEvent(QShowEvent *event) {
initSavedParms();
}
void StreamAddrSettingsDlg::on_pushStreamIPCombox_currentIndexChanged(
int index) {
if (2 == index) {
ui->pushStreamIPCombox->setEditable(true);
} else {
ui->pushStreamIPCombox->setEditable(false);
}
}
// 保存设置
void StreamAddrSettingsDlg::on_saveBtn_clicked() {
if (!g_networkSettingInfo) {
this->close();
return;
}
g_networkSettingInfo->setValue("NetworkStreamSettings/uavType",
ui->uavTypeCombox->currentIndex());
g_networkSettingInfo->setValue("NetworkStreamSettings/uavID",
ui->uavIDspinBox->value());
g_networkSettingInfo->setValue("NetworkStreamSettings/podPullAddress",
ui->podPullStreamIPEdit->text());
g_networkSettingInfo->setValue("NetworkStreamSettings/pullAddress1",
ui->pullStreamAddrEdit1->text());
g_networkSettingInfo->setValue("NetworkStreamSettings/pullAddress2",
ui->pullStreamAddrEdit2->text());
g_networkSettingInfo->setValue("NetworkStreamSettings/pullAddress3",
ui->pullStreamAddrEdit3->text());
g_networkSettingInfo->setValue("NetworkStreamSettings/pullAddress4",
ui->pullStreamAddrEdit4->text());
int pushStreamIndex = ui->pushStreamIPCombox->currentIndex();
g_networkSettingInfo->setValue("NetworkStreamSettings/pushStreamType",
pushStreamIndex);
if (2 == pushStreamIndex) {
g_networkSettingInfo->setValue(
"NetworkStreamSettings/pushStreamAddress",
ui->pushStreamIPCombox->currentText());
}
this->close();
}
void StreamAddrSettingsDlg::initSavedParms() {
if (!g_networkSettingInfo) return;
ui->uavTypeCombox->setCurrentIndex(
g_networkSettingInfo->value("NetworkStreamSettings/uavType").toInt());
ui->uavIDspinBox->setValue(
g_networkSettingInfo->value("NetworkStreamSettings/uavID").toInt());
ui->podPullStreamIPEdit->setText(
g_networkSettingInfo->value("NetworkStreamSettings/podPullAddress")
.toString());
ui->pullStreamAddrEdit1->setText(
g_networkSettingInfo->value("NetworkStreamSettings/pullAddress1")
.toString());
ui->pullStreamAddrEdit2->setText(
g_networkSettingInfo->value("NetworkStreamSettings/pullAddress2")
.toString());
ui->pullStreamAddrEdit3->setText(
g_networkSettingInfo->value("NetworkStreamSettings/pullAddress3")
.toString());
ui->pullStreamAddrEdit4->setText(
g_networkSettingInfo->value("NetworkStreamSettings/pullAddress4")
.toString());
int pushStreamIndex =
g_networkSettingInfo->value("NetworkStreamSettings/pushStreamType")
.toInt();
ui->pushStreamIPCombox->setCurrentIndex(pushStreamIndex);
if (2 == pushStreamIndex) {
ui->pushStreamIPCombox->setItemText(
pushStreamIndex,
g_networkSettingInfo
->value("NetworkStreamSettings/pushStreamAddress")
.toString());
}
}

@ -0,0 +1,34 @@
#ifndef STREAMADDRSETTINGSDLG_H
#define STREAMADDRSETTINGSDLG_H
#include <QDialog>
#include "global.h"
namespace Ui {
class StreamAddrSettingsDlg;
}
class StreamAddrSettingsDlg : public QDialog {
Q_OBJECT
public:
explicit StreamAddrSettingsDlg(QWidget *parent = nullptr);
~StreamAddrSettingsDlg();
protected:
void showEvent(QShowEvent *event);
private slots:
void on_pushStreamIPCombox_currentIndexChanged(int index);
void on_saveBtn_clicked();
private:
void initSavedParms();
private:
Ui::StreamAddrSettingsDlg *ui;
};
#endif // STREAMADDRSETTINGSDLG_H

@ -0,0 +1,232 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>StreamAddrSettingsDlg</class>
<widget class="QDialog" name="StreamAddrSettingsDlg">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>571</width>
<height>350</height>
</rect>
</property>
<property name="windowTitle">
<string>Dialog</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2" stretch="1,2,1,1">
<property name="leftMargin">
<number>4</number>
</property>
<property name="topMargin">
<number>4</number>
</property>
<property name="rightMargin">
<number>4</number>
</property>
<property name="bottomMargin">
<number>4</number>
</property>
<item>
<widget class="QGroupBox" name="groupBox_3">
<property name="title">
<string>飞机信息</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<layout class="QGridLayout" name="gridLayout_3" columnstretch="1,4,1,4">
<item row="0" column="0">
<widget class="QLabel" name="label_7">
<property name="text">
<string>飞机型号:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="uavTypeCombox"/>
</item>
<item row="0" column="2">
<widget class="QLabel" name="label_8">
<property name="text">
<string>飞机ID</string>
</property>
</widget>
</item>
<item row="0" column="3">
<widget class="QSpinBox" name="uavIDspinBox">
<property name="buttonSymbols">
<enum>QAbstractSpinBox::ButtonSymbols::NoButtons</enum>
</property>
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>1000</number>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox">
<property name="title">
<string>拉流地址</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<property name="leftMargin">
<number>4</number>
</property>
<property name="topMargin">
<number>4</number>
</property>
<property name="rightMargin">
<number>4</number>
</property>
<property name="bottomMargin">
<number>4</number>
</property>
<item>
<layout class="QGridLayout" name="gridLayout" columnstretch="1,4,1,4,0">
<property name="topMargin">
<number>4</number>
</property>
<property name="horizontalSpacing">
<number>7</number>
</property>
<property name="verticalSpacing">
<number>12</number>
</property>
<item row="2" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>备用3</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>吊舱:</string>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QLabel" name="label_5">
<property name="text">
<string>备用2</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>备用1</string>
</property>
</widget>
</item>
<item row="2" column="2">
<widget class="QLabel" name="label_4">
<property name="text">
<string>备用4</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="podPullStreamIPEdit"/>
</item>
<item row="1" column="1">
<widget class="QLineEdit" name="pullStreamAddrEdit1"/>
</item>
<item row="1" column="3">
<widget class="QLineEdit" name="pullStreamAddrEdit2"/>
</item>
<item row="2" column="1">
<widget class="QLineEdit" name="pullStreamAddrEdit3"/>
</item>
<item row="2" column="3">
<widget class="QLineEdit" name="pullStreamAddrEdit4"/>
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox_2">
<property name="title">
<string>推流地址</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="leftMargin">
<number>4</number>
</property>
<property name="topMargin">
<number>4</number>
</property>
<property name="rightMargin">
<number>4</number>
</property>
<property name="bottomMargin">
<number>4</number>
</property>
<item>
<layout class="QGridLayout" name="gridLayout_2" columnstretch="1,4" columnminimumwidth="0,0">
<item row="0" column="0">
<widget class="QLabel" name="label_6">
<property name="text">
<string>服务器地址:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="pushStreamIPCombox"/>
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="saveBtn">
<property name="text">
<string>保存设置</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>
Loading…
Cancel
Save