Qt小项目 | 实现迅雷设置界面

文章目录

  • 一、手写代码实现迅雷设置界面

一、手写代码实现迅雷设置界面

  使用Qt控件(如:QListWidget与QScrollArea等)与布局实现腾讯会议登陆界面。设置界面除基本设置界面外,其他界面都是以图片的形式嵌入到项目中并没有手写代码。
基本设置界面的布局如下:
image-20240626183430748

  代码实现如下:
SCrollAreaDemo.h

#pragma once#include "CBaseSetWidget.h"
#include "GaojiSetWidget.h"
#include <QtWidgets/QWidget>
#include <QListWidget>
#include <QScrollArea>
#include <QScrollBar>
#include <QHBoxLayout>
#include <QStringList>
#include <QVector>class ScrollAreaDemo : public QWidget
{Q_OBJECTpublic:ScrollAreaDemo(QWidget *parent = Q_NULLPTR);private:QListWidget* m_pListWidget;QScrollArea* m_pScrollArea;QStringList  m_textList;CBaseSetWidget* m_pBaseSetWidget;QWidget* m_pYunpanSetWidget;QWidget* m_pDownloadWidget;QWidget* m_pJieguanWidget;QWidget* m_pRenwuWidget;QWidget* m_pTixingWidget;QWidget* m_pXuanfuWidget;GaojiSetWidget* m_pGaojiWidget;QVector<QWidget*> m_vecWidget;bool signFlag = false;private:void slotItemClicked(QListWidgetItem* item);void slotValueChanged(int value);
};

SCrollAreaDemo.cpp

#include "ScrollAreaDemo.h"
#include <string>using namespace std;ScrollAreaDemo::ScrollAreaDemo(QWidget *parent): QWidget(parent)
{this->setFixedSize(QSize(150 + 1000 + 30,  900));this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowMinimizeButtonHint);this->setStyleSheet("background:rgb(26, 26, 26);");/*ListWidget*/m_pListWidget = new QListWidget(this);m_pListWidget->setFixedWidth(150);m_pListWidget->setFrameShape(QFrame::NoFrame);	//设置控件边框形状为无边框m_pListWidget->setFocusPolicy(Qt::NoFocus);m_textList << u8"基本设置" << u8"云盘设置" << u8"下载设置" << u8"接管设置" << u8"任务管理" << u8"提醒" << u8"悬浮窗" << u8"高级设置";m_pListWidget->addItems(m_textList);    //添加多个列表项//lw的样式表;R"()";常用来写jsonstring lw_qss = R"(QListWidget{/*border:1px solid gray;    边界线:宽度、颜色*/background:rgb(26, 26, 26);   /* 列表背景色*/color:rgb(200, 200, 200);     /*前景色、文字颜色*/font-size:15px;border-radius:1px;	/*圆角*/}QListWidget::item{height:40px;padding-left:10px; /*控制文本与left左边的距离 */}QListWidget::item:!active{background:rgb(26, 26, 26);margin:5px 20px 1px 20px;   /*上右下左,控制item与ListWidget的距离*/}/*悬浮到项目上时发生右偏移*/QListWidget::item:hover{background:rgb(56, 56, 56);/*padding-left:30px;*/}/*选中项目时,边框圆角与背景色发生改变*/QListWidget::item:selected{border-radius:15px;background:lightblue;}/*上次选择后保留的状态,鼠标离开后显示*/QListWidget::item:selected:!active{background:rgb(51,51,51);color:#3F85FF;})";m_pListWidget->setStyleSheet(QString::fromStdString(lw_qss));/* QScrollArea */m_pScrollArea = new QScrollArea(this);m_pScrollArea->setFixedWidth(1000 + 30);m_pScrollArea->setFrameShape(QFrame::NoFrame);m_pScrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);m_pScrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);string verticalbar_qss = R"(QScrollBar{width:16px;background:rgb(26, 26, 26);margin:0px, 0px, 0px, 0px;}QScrollBar::handle:vertical{width:8px;background:rgba(162, 163, 165, 100%);border-radius:4px;min-height:40;}QScrollBar::handle:vertical:hover{width:8px;background:rgba(115,118,118, 100%);border-radius:4px;min-height:40;}QScrollBar::add-page:vertical,QScrollBar::sub-page:vertical{background:rgb(26, 26, 26);border-radius:4px;}QScrollBar::top-arrow:vertical,QScrollBar::bottom-arrow:vertical{border: none;background: none;color: none;}QScrollBar::add-line:vertical{border:none;background:none;}QScrollBar::sub-line:vertical{border:none;background:none;})";m_pScrollArea->verticalScrollBar()->setStyleSheet(QString::fromStdString(verticalbar_qss));/*基本设置使用自定义类,其他部分使用图片代替*/m_pBaseSetWidget = new CBaseSetWidget;m_vecWidget.push_back(m_pBaseSetWidget);m_pYunpanSetWidget = new QWidget;m_pYunpanSetWidget->setStyleSheet("background-image:url(:/ScrollAreaDemo/resources/YunPanSet.png);background-repeat: no-repeat;background-color:rgb(51, 51, 51)");m_pYunpanSetWidget->setFixedSize(1000, 478);m_vecWidget.push_back(m_pYunpanSetWidget);m_pDownloadWidget = new QWidget;m_pDownloadWidget->setStyleSheet("background-image:url(:/ScrollAreaDemo/resources/XiaZai.png);background-repeat: no-repeat;background-color:rgb(51, 51, 51)");m_pDownloadWidget->setFixedSize(1000, 337);m_vecWidget.push_back(m_pDownloadWidget);m_pJieguanWidget = new QWidget;m_pJieguanWidget->setStyleSheet("background-image:url(:/ScrollAreaDemo/resources/JieGuanSet.png);background-repeat: no-repeat;background-color:rgb(51, 51, 51)");m_pJieguanWidget->setFixedSize(1000, 340);m_vecWidget.push_back(m_pJieguanWidget);m_pRenwuWidget = new QWidget;m_pRenwuWidget->setStyleSheet("background-image:url(:/ScrollAreaDemo/resources/RenwuGuanli.png);background-repeat: no-repeat;background-color:rgb(51, 51, 51)");m_pRenwuWidget->setFixedSize(1000, 413);m_vecWidget.push_back(m_pRenwuWidget);m_pTixingWidget = new QWidget;m_pTixingWidget->setStyleSheet("background-image:url(:/ScrollAreaDemo/resources/TiXing.png);background-repeat: no-repeat;background-color:rgb(51, 51, 51)");m_pTixingWidget->setFixedSize(1000, 728);m_vecWidget.push_back(m_pTixingWidget);m_pXuanfuWidget = new QWidget;m_pXuanfuWidget->setStyleSheet("background-image:url(:/ScrollAreaDemo/resources/XuanFuChuang.png);background-repeat: no-repeat;background-color:rgb(51, 51, 51)");m_pXuanfuWidget->setFixedSize(1000, 206);m_vecWidget.push_back(m_pXuanfuWidget);m_pGaojiWidget = new GaojiSetWidget;m_vecWidget.push_back(m_pGaojiWidget);QWidget* widget = new QWidget;QVBoxLayout* pVLay = new QVBoxLayout(widget);/*将所有的“设置Widget”添加进来*/for (auto w : m_vecWidget){pVLay->addWidget(w);pVLay->addSpacing(15);}pVLay->setContentsMargins(0, 5, 0, 5);//给QScrollArea设置Widgetm_pScrollArea->setWidget(widget);//整体布局QHBoxLayout* hlay = new QHBoxLayout(this);hlay->addWidget(m_pListWidget);hlay->setSpacing(0);hlay->addWidget(m_pScrollArea);/*点击listWidget的Item切换显示区域*/connect(m_pListWidget, &QListWidget::itemClicked, this, &ScrollAreaDemo::slotItemClicked);/*滚动鼠标中建时ScrollBar值变化的信号槽*/connect(m_pScrollArea->verticalScrollBar(), &QScrollBar::valueChanged,this, &ScrollAreaDemo::slotValueChanged);
}void ScrollAreaDemo::slotItemClicked(QListWidgetItem* item)
{signFlag = true;QString itemText = item->text();QPoint widgetPos;int size = m_textList.size();for (int i = 0; i < size; i++){if (itemText == m_textList[i]){widgetPos = m_vecWidget[i]->pos();}}m_pScrollArea->verticalScrollBar()->setValue(widgetPos.y());
}void ScrollAreaDemo::slotValueChanged(int value)
{if (!signFlag){int itemSize = m_vecWidget.size();for (int i = 0; i < itemSize; i++){//visibleRegion()用来获取当前控件的可视区域,if (!m_vecWidget[i]->visibleRegion().isEmpty()){m_pListWidget->item(i)->setSelected(true);	//设置列表项的选中状态return;}else{m_pListWidget->item(i)->setSelected(false);}}}signFlag = false;
}

GaojiSetWidget.h:高级设置界面

#pragma once#include <QWidget>class GaojiSetWidget : public QWidget
{Q_OBJECTpublic:GaojiSetWidget(QWidget* parent = Q_NULLPTR);~GaojiSetWidget();private:};

GaojiSetWidget.cpp:高级设置界面

#include "GaojiSetWidget.h"
#include <QVBoxLayout>
#include <QLabel>GaojiSetWidget::GaojiSetWidget(QWidget* parent): QWidget(parent)
{QLabel* pLabel1 = new QLabel(this);pLabel1->setFixedSize(1000, 541);QPixmap* pixmap = new QPixmap(":/ScrollAreaDemo/resources/GaojiSet_1.png");pixmap->scaled(pLabel1->size(), Qt::KeepAspectRatio);pLabel1->setScaledContents(true);pLabel1->setPixmap(*pixmap);QLabel* pLabel2 = new QLabel(this);pLabel2->setFixedSize(1000, 685);pixmap = new QPixmap(":/ScrollAreaDemo/resources/GaojiSet_2.png");pixmap->scaled(pLabel2->size(), Qt::KeepAspectRatio);pLabel2->setScaledContents(true);pLabel2->setPixmap(*pixmap);QVBoxLayout* pVLay = new QVBoxLayout(this);pVLay->addWidget(pLabel1);pVLay->setSpacing(0);pVLay->addWidget(pLabel2);pVLay->setContentsMargins(0, 0, 0, 0);
}GaojiSetWidget::~GaojiSetWidget()
{
}

CBaseSetWidget.h:基本设置界面

#pragma once
#include <QWidget>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QCheckBox>
#include <QLabel>
#include <QLineEdit>
#include <QRadioButton>
#include <QPushButton>class CBaseSetWidget : public QWidget
{
public:CBaseSetWidget(QWidget* parent = Q_NULLPTR);~CBaseSetWidget();private:QLabel* pBasesetLabel;QCheckBox* pCheckKaijiqidong;QCheckBox* pCheckMiandarao;QLabel* p1;QLabel* p2;QCheckBox* pCheckBosskey;QLineEdit* pLineEdit;QCheckBox* pCheckNewShowMainUI;QLabel* pXiazaimoshi;QRadioButton* pQuansuxiazai;QRadioButton* pXiansuxiazai;QPushButton* pBtnModify;QLabel* label_cfginfo;QVBoxLayout* pMainVlay;QHBoxLayout* pHlay1;QVBoxLayout* pVlay1;QHBoxLayout* pHlay2;QHBoxLayout* pHlay3;QHBoxLayout* pHlay4;QVBoxLayout* pVlay2;QHBoxLayout* pHlay5;QHBoxLayout* pHlay6;
};

CBaseSetWidget.cpp:基本设置界面

#include "CBaseSetWidget.h"
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QCheckBox>
#include <QLabel>
#include <QLineEdit>
#include <QRadioButton>
#include <QPushButton>CBaseSetWidget::CBaseSetWidget(QWidget* parent):QWidget(parent)
{setWindowFlags(Qt::FramelessWindowHint);setAttribute(Qt::WA_StyledBackground);this->setStyleSheet("background-color:rgb(51, 51, 51);color:rgb(200,200,200);");QLabel* pBasesetLabel = new QLabel(this);pBasesetLabel->setText(u8"基本设置");QCheckBox* pCheckKaijiqidong = new QCheckBox(this);pCheckKaijiqidong->setText(u8"开机启动");QCheckBox* pCheckMiandarao = new QCheckBox(this);pCheckMiandarao->setFixedWidth(140);pCheckMiandarao->setText(u8"开启免打扰模式");QLabel* p1 = new QLabel(this);p1->setText("?");QCheckBox* pCheckBosskey = new QCheckBox(this);pCheckBosskey->setFixedWidth(105);pCheckBosskey->setText(u8"开启老板键");QLineEdit* pLineEdit = new QLineEdit(this);pLineEdit->setFixedWidth(100);pLineEdit->setStyleSheet("border-style:solid;border-width:1px;border-color:rgb(79,79,79);");QLabel* p2 = new QLabel(this);p2->setText("Alt+D");QCheckBox* pCheckNewShowMainUI = new QCheckBox(this);pCheckNewShowMainUI->setText(u8"新建时显示主界面");QLabel* pXiazaimoshi = new QLabel(this);pXiazaimoshi->setText(u8"下载模式");QRadioButton* pQuansuxiazai = new QRadioButton(this);pQuansuxiazai->setText(u8"全速下载");QRadioButton* pXiansuxiazai = new QRadioButton(this);pXiansuxiazai->setText(u8"极速下载");pXiansuxiazai->setFixedWidth(90);QPushButton* pBtnModify = new QPushButton(this);pBtnModify->setText(u8"修改设置");pBtnModify->setStyleSheet("background-color:#1A1A1A;color:#5F5F5F");QLabel* label_cfginfo = new QLabel(this);label_cfginfo->setText(u8"限制时间段: 00:00-23:59 最大下载速度:不限速");QVBoxLayout* pMainVlay = new QVBoxLayout(this);pMainVlay->addWidget(pBasesetLabel);pMainVlay->addSpacing(20);QHBoxLayout* pHlay1 = new QHBoxLayout(this);pHlay1->addSpacing(35);QVBoxLayout* pVlay1 = new QVBoxLayout(this);pVlay1->addWidget(pCheckKaijiqidong);pVlay1->addSpacing(20);QHBoxLayout* pHlay2 = new QHBoxLayout;pHlay2->addWidget(pCheckMiandarao);pHlay2->addWidget(p1);pVlay1->addLayout(pHlay2);  // 添加免打扰的水平布局pVlay1->addSpacing(20);QHBoxLayout* pHlay3 = new QHBoxLayout;pHlay3->addWidget(pCheckBosskey);pHlay3->addWidget(pLineEdit);pHlay3->addWidget(p2);pVlay1->addLayout(pHlay3);pVlay1->addSpacing(20);pVlay1->addWidget(pCheckNewShowMainUI);pVlay1->addSpacing(20);pVlay1->addWidget(pXiazaimoshi);  // 下载模式pVlay1->addSpacing(20);QHBoxLayout* pHlay4 = new QHBoxLayout;  //  下载模式下面的水平布局pHlay4->addSpacing(30);QVBoxLayout* pVlay2 = new QVBoxLayout(this);QHBoxLayout* pHlay5 = new QHBoxLayout;pHlay5->addWidget(pQuansuxiazai);pHlay5->addWidget(p2);pVlay2->addLayout(pHlay5);pVlay2->addSpacing(20);// 限速下载QHBoxLayout* pHlay6 = new QHBoxLayout;pHlay6->addWidget(pXiansuxiazai);pHlay6->addWidget(pBtnModify);pHlay6->addWidget(label_cfginfo);pHlay6->addStretch();pVlay2->addLayout(pHlay6);pHlay4->addLayout(pVlay2);pVlay1->addLayout(pHlay4);pHlay1->addLayout(pVlay1);pMainVlay->addLayout(pHlay1);pMainVlay->setContentsMargins(20, 20, 20, 20);
}CBaseSetWidget::~CBaseSetWidget()
{
}

main.cpp

#include "ScrollAreaDemo.h"
#include <QtWidgets/QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);ScrollAreaDemo w;w.show();return a.exec();
}

运行结果

image-20240626181415806

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/861188.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

clang: ThreadSafetyAnalysis 可以实现静态检查

最近看ovs的代码&#xff0c;发现了这个功能&#xff0c;看着非常有必要使用&#xff0c;在代码编译阶段可以帮助发现同步问题 #if __has_feature(c_thread_safety_attributes) /* "clang" annotations for thread safety check.** OVS_LOCKABLE indicates that the…

SoftwareSerial库【学习】

SoftwareSerial.h 文件解析 这个头文件定义了用于 ESP8266 和 ESP32 的软件串口实现的接口和一些功能。下面是关键部分的详细解释&#xff1a; 1. 文件头部注释 /* SoftwareSerial.h - Implementation of the Arduino software serial for ESP8266/ESP32. ... */这是文件的版…

shell脚本if/else使用示例

if判断字符串是否为空实例 #!/bin/bashread -p "input string > " str if [ -z "$str" ] thenecho "str是空" elseecho "str非空" fiif判断整数是否为…

每日一学(1)

目录 1、ConCurrentHashMap为什么不允许key为null&#xff1f; 2、ThreadLocal会出现内存泄露吗&#xff1f; 3、AQS理解 4、lock 和 synchronized的区别 1、ConCurrentHashMap为什么不允许key为null&#xff1f; 底层 putVal方法 中 如果key || value为空 抛出…

深度解析RocketMq源码-高可用存储组件(四)Dledger框架日志同步流程

1.绪论 在深度解析RocketMq源码-高可用存储组件&#xff08;一&#xff09; raft协议详解-CSDN博客 中讲过&#xff0c;raft协议中&#xff0c;日志同步主要有两个地方&#xff0c;一个是leader会跟follower同步数据&#xff0c;另一个是在新leader诞生的时候&#xff0c;会与…

6.浏览器缓存

上一篇&#x1f449;: 浏览器存储 浏览器缓存 文章目录 浏览器缓存1. 浏览器缓存机制的理解初次加载资源强制缓存阶段协商缓存阶段服务器响应版本控制策略 2 浏览器资源缓存的位置Service Worker缓存Memory Cache&#xff08;内存缓存&#xff09;Disk Cache&#xff08;磁盘缓…

更换Homebrew镜像源

Homebrew 是 macOS 上非常受欢迎的包管理工具&#xff0c;但有时由于网络问题&#xff0c;从默认源下载软件包可能会非常缓慢。为了解决这个问题&#xff0c;我们可以将 Homebrew 的源更换为国内的镜像&#xff0c;以提高下载速度。以下是更换 Homebrew 镜像源的通用步骤及错误…

【Pytorch实战教程】基于投影梯度下降(PGD)方法的对抗样本生成

文章目录 1. 总体介绍2. 完整代码3. 投影梯度下降(PGD)方法的详细介绍3.1. 背景3.2. PGD方法简介3.3. PGD攻击算法步骤3.4. PGD攻击的实现3.5. 代码解释3.6. 核心代码解释:4 补充说明x = inputs.detach()的详细解释1. 总体介绍 使用PyTorch实现基于投影梯度下降(Projected…

npm ERR! ..... reason: certificate has expired(淘宝镜像过期)

在执行npm install命令时&#xff0c;报错如下 npm ERR! request to https://registry.npm.taobao.org/babel/plugin-syntax-dynamic-import/download/babel/plugin-syntax-dynamic-import-7.8.3.tgz failed, reason: certificate has expired原因&#xff1a;淘宝证书过期 解…

vue2面试题——指令

1. 如何自定义指令 全局指令&#xff1a;在main.js里面写 /* 全局自定义指令 */ // main.js文件 import Vue from vue import App from ./App.vue import router from ./router import store from ./storeVue.config.productionTip falseVue.directive(demo,{inserted: functi…

【新闻】金融专业“免进”!私募巨头招聘涌现“新剧情”

A股市场在2024年逐渐出现新的运行特征&#xff0c;这不禁让部分主动投资的私募巨头公司重新登上招聘舞台。 但这一次&#xff0c;他们的招聘方向出现了新的变动。 有些机构有意识的为公司投研团队招聘“衔接”岗&#xff0c;有些则把重点放在了投研动作的交易层。 但这都不如…

小公司全栈是归宿吗?

在软件开发领域&#xff0c;特别是在小公司或初创公司中&#xff0c;全栈开发者的角色确实相对普遍和重要。然而&#xff0c;说“全栈是归宿”可能过于绝对&#xff0c;因为每个开发者的职业路径和兴趣点都是不同的。 以下是关于全栈开发在小公司的一些考虑&#xff1a; 需求…

JS实现:计算不同时区的当地时间

国内的时间都以北京时间为准&#xff08;即东八区的时间&#xff09;&#xff0c;如何计算同一时间下其它时区的当地时间呢&#xff1f; 通常的做法&#xff0c;是计算出时区差&#xff0c;然后进行加减。 还有另一种方法&#xff0c;就是先把本地时间转为 0时区的utc时间&…

如何使用代理 IP 防止多个 Facebook 帐户关联 - 最佳实践

在社交媒体被广泛应用的今天&#xff0c;Facebook作为全球最大的社交网络平台之一&#xff0c;面临着很多挑战&#xff0c;其中之一就是用户行为的管理和安全。 为了防止多个账户之间的关联和滥用&#xff0c;Facebook需要采取一系列措施&#xff0c;其中包括使用静态住宅代理…

云计算运维工程师的突发状况处理

云计算运维工程师在应对突发的故障和紧急情况时,需要采取一系列迅速而有效的措施来最小化服务中断的时间并恢复系统的稳定性。 以下是一些关键步骤和策略: 快速响应: 立即识别并确认故障的性质和范围。通知团队成员和相关的利益相关者,确保所有人了解当前情况。故障诊断:…

【论文阅读】-- MultiStream:探索分层时间序列的多分辨率流图方法

MultiStream: A Multiresolution Streamgraph Approach to Explore Hierarchical Time Series 摘要1 引言2相关工作2.1 堆叠图和流图可视化2.2 时间序列的层次结构2.3 交互技术 3 需求分析4 视觉映射和功能4.1 设计原理总结4.2 概述4.3 多分辨率视图4.4 控制器4.5 层次管理器 5…

使用 ADB 查看 Android 设备的 CPU 使用率(详解)

在 Android 开发和调试过程中&#xff0c;监控设备的性能数据至关重要。CPU 使用率是一个关键的性能指标&#xff0c;它能够帮助开发者识别应用的性能瓶颈和优化机会。本文将详细介绍如何使用 Android Debug Bridge (ADB) 查看设备的 CPU 使用率&#xff0c;并解释终端上各个参…

ssm日常项目中问题集合

一、 在Spring MVC和Spring Boot中&#xff0c;如果你的控制器方法参数被标注为一个Java对象&#xff0c;并且该对象的字段与表单输入字段的名称匹配&#xff0c;Spring会自动将表单数据绑定到该对象上。这种机制称为数据绑定&#xff08;Data Binding&#xff09;。 假设你有…

探索ChatGPT在程序员日常工作的多种应用

引言 在现代科技迅猛发展的今天&#xff0c;人工智能的应用已经深入到我们生活和工作的各个方面。作为程序员&#xff0c;我们时常面临大量繁杂的任务&#xff0c;从代码编写、错误调试到项目管理和团队协作&#xff0c;每一项都需要花费大量的时间和精力。近年来&#xff0c;…

基于信息论的高动态范围图像评价算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于信息论的高动态范围图像评价算法matlab仿真&#xff0c;利用一种自然图像的概率模型对图像的熵与成像动态范围之间的关系进行了数值模拟,得到了具有普遍意义上…