简述:
目录树组件
QTreeWidget
和停靠区域组件
QDockWidget
的讲解和使用
[TOC]
本文初发于 “ 偕臧的小站 “,同步转载于此。
编程环境:
win10 x64 专业版 1803
编程软件:
Qt Creator 4.8.2 (Enterprise)
,
Qt 5.9.8
QTreeWidget属性:
QTreeWidget的每个节点都是一个QTreeWidgetltem对象,添加一个节点前需先创建它,并做
好相关设置。
创建节点的语句是:
item=new QTreeWidgetItem(Mainwindow::itTopItem);
QTreeWidgetltem的 **setlcon() 和 setText()**都需要传递一个列号作为参数,指定对哪个列进行设置。列号可以直接用数字,但是为了便于理解代码和统一修改,在MainWindow里定义了枚举类型treeColNum,colltem表示第1列,colltemlype表示第2列。setFlags0函数设置节点的一些属性标记,是Qt:ltemFlag枚举类型常量的组合。setData()函数为节点的某一列设置一个角色数据,setData()函数原型为:
void QTreewidgetItem::setData(int column,int role,const QVariant &value)
其中,column是列号,role是角色的值,value是一个QVariant类型的数。
代码中设置节点数据的语句是:
item->setData(Mainwindow::colItem,Qt::UserRole,QVariant(dataStr));
它为节点的第1列,角色
Qt:UserRole
,设置了一个字符串数据dataStr。Qt:UserRole是枚举类型Qt::ItemDataRole中一个预定义的值,关于节点的角色和Qt:ItemDataRole在后面文章详细介绍。
创建并设置好节点后,
用QTreeWidget::addTopLevelltem()函数将节点作为顶层节点添加到目录树。
QDockWidget 属性:
主要属性如下:
或不允许停靠。
本实例设置为允许左侧和右侧停靠。
QDockWidget::DockWidgetClosable:停靠区可关闭。
QDockWidget:DockWidgetMovable:停靠区可移动。
QDock Widget:DockWidgetFloatable:停靠区可浮动。
QDock Widget:Dock Widget VerticalTitleBar:在停靠区左侧显示垂直标题栏。
QDock Widget::AlDockWidgetFeatures:使用以上所有特征。
QDock Widget::NoDockWidgetFeatures:不能停靠、移动和关闭。
ScrollArea属性:
ScrollArea
是一个提供了一个滚动视图到另一个部件。
滚动区域用于显示一个画面中的子部件的内容。如果部件超过画面的大小,视图可以提供滚动条,这样就都可以看到部件的整个区域。
细节注意:
在主窗口构造函数里将ScrollArea组件设置为主窗口工作区的中心组件后,
DockWidget
与
ScrollArea
之间自动出现分割条,可以分割两个组件的大小。
部分源码:
其中 ExQTreeWidget.h :
#ifndef EXQTREEWIDGET_H
#define EXQTREEWIDGET_H
#include <QMainWindow>
#include <QLabel>
#include <QTreeWidgetItem>
#include <QFileDialog>
namespace Ui {
class ExQTreeWidget;
class ExQTreeWidget : public QMainWindow
Q_OBJECT
public:
enum treeItemType { //枚举,节点类型
itemRoot,
itemFile,
itemImage
enum treeColNum { //目录树列表的编号
colItem = 0,
colItemType = 1
explicit ExQTreeWidget(QWidget *parent = nullptr);
~ExQTreeWidget();
void initTree(); //初始化根节点(唯一)
void addFolderItem(QTreeWidgetItem *parItem, QString dirName); //添加目录
void addImageItem(QTreeWidgetItem *parItem, QString fileName); //添加图片文件
QString getFinalFolderName(const QString &pathName); //从完整的路径里面,获取最后的文件夹名称
void changeItemCaption(QTreeWidgetItem* parItem); //遍历item下面的所有节点
void displayImage(QTreeWidgetItem* item); //显示当前item的图片(默认以适配高度)
private slots:
void on_actAddFolder_triggered(); //增加文件夹
void on_actAddFile_triggered(); //添加图片文件
void on_actDeleFile_triggered(); //删除节点
void on_actScanItems_triggered(); //遍历所有的顶层节点(本处只有一个root顶层节点)
void on_actAdaptiveHeight_triggered(); //图片自动适应高度
void on_actAdaptiveWidth_triggered(); //图片自动适应宽度
void on_actAmplification_triggered(); //放大
void on_actShrink_triggered(); //缩小
void on_actZoomRealSize_triggered(); //还原
void on_actDockFloating_triggered(bool check); //设置Dock窗口是否浮动
void on_actDockVisible_triggered(bool checked); //设置Dock窗口是否隐藏不显示
void on_actQiut_triggered(); //退出
void on_treeFiles_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous); //当前节点变化的时候,自动加载当前图片
void on_dockWidget_visibilityChanged(bool visible); //单击DockWidget组件的标题栏的关闭按钮时候,会隐藏在停靠区域,并且发射信号visibilityChanged; 停靠区域可见性变化
void on_dockWidget_topLevelChanged(bool topLevel); //当拖动DockWidget组件,使其浮动或者停靠时候,会发射信号topLevelChanged; 更新其Action的状态
private:
Ui::ExQTreeWidget *ui;
QLabel *m_labFlie; //状态栏显示当前文件路径
QPixmap m_curPixmap; //显示当前文件图片
float m_ratio; //图片缩放比例
#endif // EXQTREEWIDGET_H
和 ExQTreeWidget.cpp :如下
#include "ExQTreeWidget.h" #include "ui_ExQTreeWidget.h" ExQTreeWidget::ExQTreeWidget(QWidget *parent) : QMainWindow(parent), ui(new Ui::ExQTreeWidget) ui->setupUi(this); setWindowTitle(QObject::tr("QTreeWidget和QDockWidget的讲解和使用")); setCentralWidget(ui->scrollArea); //设置scrollArea为中心控件 initTree(); m_labFlie = new QLabel("当前文件的路径:", this); ui->statusBar->addWidget(m_labFlie); ExQTreeWidget::~ExQTreeWidget() delete ui; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //初始化根节点(只能够有唯一) void ExQTreeWidget::initTree() //准备工作 ui->treeFiles->clear(); QString dataStr = ""; QIcon icon; icon.addFile(":/image/Image001.jpg"); //创建唯一root的节点 QTreeWidgetItem* root = new QTreeWidgetItem(treeItemType::itemRoot); root->setIcon(treeColNum::colItem, icon); root->setText(treeColNum::colItem, QString("相簿")); root->setText(treeColNum::colItemType, QString("treeItemType")); root->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsAutoTristate); root->setCheckState(treeColNum::colItem, Qt::Unchecked); root->setData(treeColNum::colItem, Qt::UserRole, QVariant(dataStr)); //添加顶层节点 ui->treeFiles->addTopLevelItem(root); //添加目录节点 void ExQTreeWidget::addFolderItem(QTreeWidgetItem *parItem, QString dirName) QIcon icon; icon.addFile(":/image/Image006.jpg"); //添加一个新的节点 QTreeWidgetItem* item = new QTreeWidgetItem(treeItemType::itemFile); QString folderName = getFinalFolderName(dirName); item->setIcon(treeColNum::colItem, icon); item->setText(treeColNum::colItem, folderName); item->setText(treeColNum::colItemType, QString("treeItemType")); item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsAutoTristate); item->setCheckState(treeColNum::colItem, Qt::Unchecked); item->setData(treeColNum::colItem, Qt::UserRole, QVariant(dirName)); //添加子节点 if (parItem->type() == treeItemType::itemFile) { //若是文件节点 parItem->addChild(item); } else if (parItem->type() == treeItemType::itemRoot) { //若是唯一root节点 QTreeWidgetItem *root = ui->treeFiles->topLevelItem(0); root->addChild(item); //添加图片节点 void ExQTreeWidget::addImageItem(QTreeWidgetItem *parItem, QString fileName) if (parItem == nullptr) return; QIcon icon; icon.addFile(":/image/Image014.jpg"); //添加一个新的节点 QTreeWidgetItem* item = new QTreeWidgetItem(treeItemType::itemImage); QString folderName = getFinalFolderName(fileName); item->setIcon(treeColNum::colItem, icon); item->setText(treeColNum::colItem, folderName); item->setText(treeColNum::colItemType, QString("treeItemType")); item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsAutoTristate); item->setCheckState(treeColNum::colItem, Qt::Unchecked); item->setData(treeColNum::colItem, Qt::UserRole, QVariant(fileName)); //添加子节点 if (parItem->type() == treeItemType::itemFile) { //若是文件节点 parItem->addChild(item); } else if (parItem->type() == treeItemType::itemRoot) { //若是唯一root节点 QTreeWidgetItem *root = ui->treeFiles->topLevelItem(0); root->addChild(item); //从完整的路径里面,获取最后的文件夹名称 QString ExQTreeWidget::getFinalFolderName(const QString &pathName) QString path = pathName; int cnt = pathName.count(); int i = pathName.lastIndexOf("/"); QString str = pathName.right(cnt - i - 1); return str; //遍历传进来的父节点下的所有子节点;每遍历过该节点,就在其节点的信息加一个# void ExQTreeWidget::changeItemCaption(QTreeWidgetItem *parItem) QString str = "# " + parItem->text(treeColNum::colItem); parItem->setText(treeColNum::colItem, str); if (parItem->childCount() < 0) return; for (int i = 0; i < parItem->childCount(); i++) { changeItemCaption(parItem->child(i)); //回调,调用自己 //显示当前item的图片(默认以适配高度) void ExQTreeWidget::displayImage(QTreeWidgetItem *item) QString fileName = item->data(treeColNum::colItem, Qt::UserRole).toString(); m_labFlie->setText(fileName); m_curPixmap.load(fileName); //从文件载入图片 on_actAdaptiveHeight_triggered(); //自动适应高度显示 ui->actAmplification->setEnabled(true); ui->actShrink->setEnabled(true); ui->actZoomRealSize->setEnabled(true); ui->actAdaptiveHeight->setEnabled(true); ui->actAdaptiveWidth->setEnabled(true); //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //增加文件夹 void ExQTreeWidget::on_actAddFolder_triggered() QString path = QFileDialog::getExistingDirectory(); //选择目录 if (! path.isEmpty()) { QTreeWidgetItem* item = ui->treeFiles->currentItem(); //获取当前节点 if(item != nullptr) addFolderItem(item, path); //添加图片 void ExQTreeWidget::on_actAddFile_triggered() QStringList list = QFileDialog::getOpenFileNames(this, "选择多个将要加载的图片", "", "Images(*.jpg, *.png, *.*)"); //选择目录 if (! list.isEmpty()) { QTreeWidgetItem* parItem = nullptr; QTreeWidgetItem* item = ui->treeFiles->currentItem(); //获取当前节点 if (item == nullptr) return; if (item->type() == treeItemType::itemImage) { //获得父节点 parItem = item->parent(); } else { parItem = item; for (int i = 0; i < list.size(); i++) { QString strName = list.at(i); //获得文件名称 addImageItem(parItem, strName); //添加图片文件到文件节点 //删除节点 void ExQTreeWidget::on_actDeleFile_triggered() QTreeWidgetItem* parItem = nullptr; QTreeWidgetItem* currItem = ui->treeFiles->currentItem(); if (currItem->type() != treeItemType::itemRoot) parItem = currItem->parent(); //只能够由其父节点删除 // else // ui->treeFiles->takeTopLevelItem(0); //删除顶层节点使用这个 if (currItem == nullptr || parItem == nullptr) return; parItem->removeChild(currItem); //移除没有从内存中删除,所以delete删除 delete currItem; //遍历所有的顶层节点(本处只有一个root顶层节点) void ExQTreeWidget::on_actScanItems_triggered() for (int i = 0; i < ui->treeFiles->topLevelItemCount(); i++) { QTreeWidgetItem* currItem = ui->treeFiles->topLevelItem(i); //顶层item changeItemCaption(currItem); //图片自动适应高度 void ExQTreeWidget::on_actAdaptiveHeight_triggered() int height = ui->scrollArea->height(); //得到scrollArea的高度 int realHeight = m_curPixmap.height(); //原始图片的实际高度 m_ratio = height * 1.0 / realHeight; //当前显示比例,必须转换为浮点数 QPixmap pixmap = m_curPixmap.scaledToHeight(height - 50); //图片缩放到指定高度 ui->labDisplay->setPixmap(pixmap); //设置Label的PixMap //图片自动适应宽度 void ExQTreeWidget::on_actAdaptiveWidth_triggered() int width = ui->scrollArea->width(); int realWidth = m_curPixmap.width(); m_ratio = width * 1.0 / realWidth; QPixmap pixmap = m_curPixmap.scaledToHeight(width - 50); ui->labDisplay->setPixmap(pixmap); //当前节点变化的时候,自动加载当前图片 void ExQTreeWidget::on_treeFiles_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous) if (current != nullptr && previous != nullptr) { displayImage(current); void ExQTreeWidget::on_actAmplification_triggered() m_ratio *= 1.2; //在当前比例基础上乘以0.8 int height = m_curPixmap.height() * m_ratio; // 显示宽度 int widht = m_curPixmap.width() * m_ratio; // 显示宽度 QPixmap pix = m_curPixmap.scaled(widht, height); //图片缩放到指定高度和宽度,保持长宽比例 ui->labDisplay->setPixmap(pix); void ExQTreeWidget::on_actShrink_triggered() m_ratio *= 0.8; int height = m_curPixmap.height() * m_ratio; int widht = m_curPixmap.width() * m_ratio; QPixmap pix = m_curPixmap.scaled(widht, height); ui->labDisplay->setPixmap(pix); void ExQTreeWidget::on_actZoomRealSize_triggered() m_ratio = 1; int height = m_curPixmap.height(); int widht = m_curPixmap.width(); QPixmap pix = m_curPixmap.scaled(widht, height); ui->labDisplay->setPixmap(pix); //设置Dock窗口是否浮动 void ExQTreeWidget::on_actDockFloating_triggered(bool check) ui->dockWidget->setFloating(check); //设置Dock窗口是否隐藏不显示 void ExQTreeWidget::on_actDockVisible_triggered(bool checked) ui->dockWidget->setVisible(!checked); void ExQTreeWidget::on_actQiut_triggered() close(); //单击DockWidget组件的标题栏的关闭按钮时候,会隐藏在停靠区域,并且发射信号visibilityChanged; 停靠区域可见性变化 void ExQTreeWidget::on_dockWidget_visibilityChanged(bool visible) ui->actDockVisible->setChecked(visible); //当拖动DockWidget组件,使其浮动或者停靠时候,会发射信号topLevelChanged; 更新其Action的状态 void ExQTreeWidget::on_dockWidget_topLevelChanged(bool topLevel) ui->actDockFloating->setChecked(topLevel); 学习 - Linux 56
学习 - Windows 43
- ArchLinux + DDE 安装教程
- DTK常用和测试代码片
- DTK的历史起源、发展,和简单入门(精华篇)
- Deepin / UOS 中配置 DTK 开发环境
- Deepin Custom Modify Window Corner Rounding Size
- Deepin 开发任务栏网速插件 lfxSpeed
- Deepin 愿望墙:社区插件等需求调研结果
- Deepin 自定义修改窗口圆角大小
- Deepin 任务栏网速插件推荐 NetSpeed(重构 lfxSpeed)
- Linux or Mac 安装 gitbook 3.2.3 失败解决方案
- Linux 中用 dh_make 将 Qt + CMake 项目打包为 deb 文件
- Linux 该如何自我系统的学习「心路」?
- Linux上面使用lintian检测deb包报错的解决方案
- Linux下使用gcc生成动态库.so和调用(图文并茂,坑已踩完)
- Linux下使用gcc生成静态库.a和调用(图文并茂,坑已踩完)
- Linux中apt与apt-get命令的区别与解释
- Linux中fork创建(兄弟)子进程,验证进程之间全局变量不共享,exec函数族
- Linux中man手册,阻塞和非阻塞,stat,文件操作和遍历,文件描述符复制dup()
- Linux中使用使用互斥量(锁)Mutex来操持多线程同步执行pthread_mutex_lock()
- Linux中创建多线程实例pthread_create()
- Linux中创建守护进程setsid()
- Linux中原子操作,死锁原因以及解决方法,读写锁的属性和函数使用pthread_rwlock_wrlock()
- Linux中多线程使用信号量(信号灯),和sem_wait()函数使用
- Linux中多线程使用条件变量阻塞线程,和pthread_cond_wait()函数使用
- Linux中多线程操作函数pthread_exit()、pthread_jion()、pthread_detach()、pthread_cancel()
- Linux中孤儿进程,僵尸进程,进程回收wait、waitpid函数
- Linux中文件操作,软硬链接ln,用户权限chmod、chown,文件查找和检索find、grep,压缩gz,bz2
- Linux中普通的进程间通信方式--有名管道fifo(适用于无血缘关系的进程)
- Linux中未决信号集和阻塞信号集的状态关系sigaddset,以及捕捉信号函数signal、sigaction
- Linux中父子进程、兄弟子进程之间通信方式--匿名管道pipe(适用于有血缘关系的进程)
- Linux中系统信号初识,和函数kill,raise,abort,alarm,setitimer
- Linux中虚拟地址空间、pcb、文件描述符、C库函数工作流程、标准库和系统库函数区别
- Linux中进程间的通信方式--内存映射区mmap()
- Linux学习:root,apt,vim,gcc,静动态库制作和使用
- PicGo在uos&&deepin系统运行失败:chrome-sandbox is owned by root and has mode 4755
- Qt 项目用 doxygen 生成 .qch,嵌入文档到 Assistants
- QtCreator 中自定义项目例子置于“欢迎-实例”中
- Qv2ray 检测到 DDE 环境,提示弹窗:Deepin 设置代理错误
- Shell、Bash、CMD、PowerShell 的区别
- Sunny 截图上架 Microsoft Store 及Linux商店的指北
- deepin、dde的历史起源与发展(附deepin所有版本的dde截图)
- gcc和g++的区别,编译.c和.cpp文件的区别
- gcc工作流程:预处理,编译,汇编,链接
- gdb调试器的使用,初探全貌
- 使用gpg提交遇到error:gpg数据签名失败fatal:写提交对象失败
- 嘿嘿!开发了一款 Sunny 截图 & 钉图,亦支持“屏幕识图”和“OCR”的软件
- 在Linux中,编写入门的makefile文件,然后逐渐迭代
- 在MacOS上面通过brew命令安装gcc编译器集
- 对 GNU/Linux 介绍、ArchLinux社区氛围、DDE移植Arch流程
- 小米AX6S刷OpenWrt和开启OpenClash,及刷回官网固件
- 小米路由器 R4A 刷原生 OpenWrt 后的风景
- 翻译:Qt5 on Wayland
- 翻译:Wayland架构、渲染、硬件支持
- 重装 UOS Deepin V20 后必安装软件(个人习惯)
- 阿里云服务器 nginx 上部署 SSL 证书实现 https 访问
- 阿里云服务器部署 Hexo 博客
学习 - C/C++ 序二 经验 24
- Beyond Compare 4文件对比神器 (带官网离线安装包和破解工具) 破解教程
- Git Bash 在win10 显示中文为数字的解决方案
- Git Bash下安装使用tree(windows)
- LPSTR/LPCSTR/LPTSTR/HWND/HANDLE/HMODULE/HINSTANCE 等含义和区别
- Navicat Premium 12激活破解教程(亲测可用)(附上官网离线安装包和破解工具)
- Qt新弹窗不响应键盘按键,难道也是无焦点?
- STL 中给 vector 去重的三种方法
- STL 的 std::set 创建自定义结构体的对象,定义严格弱序的比较函数
- Shell、Bash、CMD、PowerShell 的区别
- Sunny 截图上架 Microsoft Store 及Linux商店的指北
- UltraEdit_chinese_64.exe强大的记事本工具(带官网离线安装包和破解工具)破解教程
- VS2017调试Qt源码
- VS2019调试Qt5时QString显示为内存地址而非字符串
- VS2022 And QtCreator10 调试 Qt 源码教程
- Visual Studio 2019 进行远程调试
- Visual Studio 断点调试之箭头偏移进错函数,怪异捉🐛记
- Visual Studio实际仅增删数行,却显示文件所有行均发生变更
- Visual Studio生成.vs隐藏文件夹,导致Git命令错误
- Win10 安装 CLion + CMake + MSVC / MinGW 作 QT 开发
- WinDbg:入门分析 dmp 文件『一』
- WinDbg:调试之附加进程生成 dmp『二』
- Windows 打造颜值和实用可媲美 Linux 的终端:Pwsh7 + OhMyPosh
- Windows 编程之 WINUSERAPI 和 WINAPI 区别
- Windows-Terminal 配置 OhMyPosh 美化 GitBash
- XMind 8 Update 8 Pro 激活教程(亲测可用) 国外官网下载 破解教程(带离线安装包)
- dot 绘图语言
- iPhone 13 Pro 更换『移植电芯』和『超容电池』🔋体验
- Win10的20H2使用VS2019,拖曳窗口会崩溃
- “.inl”文件在C++工程的意义
- 一个微软自带的 notepad 所导致的问题
- 为 Windows10 22H2 启用 Microsoft Copilot 功能
- 入门分析,多线程竞争为何不安全?
- 分享如何拥有一份私人的『开源代码签名证书』
- 创建 QKeySequenceEdit() 后,显示方块■◆乱码
- 制作一根好的六类网线使用
- 嘿嘿!开发了一款 Sunny 截图 & 钉图,亦支持“屏幕识图”和“OCR”的软件
- 微软 SDK 导致的项目编译失败哦!
- 愿编程不再乱码(含Qt)-根因深究
- 由于找不到VCRUNTIME140D.dll,无法继续执行代码
- 破解百度云 PanDownload_Beta 使用
- 简洁且易用的ChatGPT&AI的桌面应用程序ThinkyMate → 不需登录
- 编译 LNK1104 无法打开文件“ xxx.dll”
- 获取当前模块 exe / dll 的版本号信息
学习 - MacOS 23
- C++ 实现智能指针:shared_ptr 和 unique_ptr
- C++ 标志位使用:校验、添加、删除
- C++ 类的六个特殊成员函数
- LPSTR/LPCSTR/LPTSTR/HWND/HANDLE/HMODULE/HINSTANCE 等含义和区别
- Lambda 表达式详解
- Log:日志之 Spdlog 极简用法示范『二』
- Log:日志之 Spdlog 核心构成『三』
- Log:日志选型调研『一』
- Misleading indentation; statement is not part of the previous 'if'
- Qt新弹窗不响应键盘按键,难道也是无焦点?
- STL 中给 vector 去重的三种方法
- STL 的 std::set 创建自定义结构体的对象,定义严格弱序的比较函数
- Visual Studio 2019 进行远程调试
- Visual Studio 断点调试之箭头偏移进错函数,怪异捉🐛记
- WinDbg:入门分析 dmp 文件『一』
- WinDbg:调试之附加进程生成 dmp『二』
- Windows 编程之 WINUSERAPI 和 WINAPI 区别
- “.inl”文件在C++工程的意义
- 一个微软自带的 notepad 所导致的问题
- 入门分析,多线程竞争为何不安全?
- 创建 QKeySequenceEdit() 后,显示方块■◆乱码
- 微软 SDK 导致的项目编译失败哦!
- 简洁且易用的ChatGPT&AI的桌面应用程序ThinkyMate → 不需登录
- 获取当前模块 exe / dll 的版本号信息
学习 - C/C++ 序一 技法 35
- Linux 该如何自我系统的学习「心路」?
- MacOS 安装 Parallels Desktop,再安装 UOS 20 + QtCreaor,及搭建 DTK 开发环境
- MacOS 安装 QtCreator 5.9.8 作 C++ 的 IDE 开发工具
- MacOS 的 VMware Fusionlimian 中安装 Linux Deepin15.11
- Mac的邮件客户端使用--登录GMail邮箱和QQ邮箱的解决方案
- Shell、Bash、CMD、PowerShell 的区别
- Sunny 截图上架 Microsoft Store 及Linux商店的指北
- gcc和g++的区别,编译.c和.cpp文件的区别
- MacOS 安装切换到 zsh
- macOS执行npm install -g hexo-cli失败的解决方法
- 使用gpg提交遇到error:gpg数据签名失败fatal:写提交对象失败
- 修改typora主题的字体
- 嘿嘿!开发了一款 Sunny 截图 & 钉图,亦支持“屏幕识图”和“OCR”的软件
- 在 Mac 编译成功运行 qt5.15 源码:debug 和 release 版本
- 在Linux中,编写入门的makefile文件,然后逐渐迭代
- 在MacOS10.14.6安装最新gdb8.3的详细教程,含可能遇到的所有坑(网上最新教程)
- 在MacOS上面通过brew命令安装gcc编译器集
- 在MacOS解决"修改“Applications”需要输入管理员名称和密码"的方法
- 在MacOS,在zsh中设置,使用Homebrew具有自动补全功能
- 在Mac上打不开“uPic.dmg”,因为 Apple 无法检查其是否包含恶意软件
- 在Mac上面安装HomeBrew失败的解决方案:修改hosts文件
- 在Mac使用Wine运行Windows软件:PanDownload_Beat(非虚拟机)
- 重装 Mac 系统后的安装软件和个人配置[个人习惯]
学习 - 设计模式 1 专栏 - QtExamples系列 67
- C++ 深入虚函数表
- C++ 重载(overload)、重写(overrride)、重定义(redefine)总结
- c++常见面试题30道
- C++: explicit的适用场合以及为什么要使用explicit
- C语言中的 static变量(全局和局部)、static函数总结
- GitHub某一个小仓库 cPlusPlus 仓库里面的一些项目集合的展示
- Make、Makefile、Cmake、QMake 的区别
- OpenMesh入门,安装,运行示例Hello World
- OpenMesh模型分割:区域增长实现
- QStyle自定义重绘QSlider控件二
- `Qt`中`QT_BEGIN_NAMESPACE`和`QT_END_NAMESPACE`的作用'
- Qt 编程中 namespace Ui { class Widget; } 解析
- Qt资料大全和Google编程规范(中文版,含c++、java等)
- Qt5 QTreeWidget使用 创建具有多级联动和复选框的树形控件
- Qt的`emit`发射(信号)、`signals`信号、`slot`槽的使用
- STL之仿函数、谓词、内建函数对象、适配器、常用算法
- STL之常用容器string、vector、deque、stack、list、set、map讲解
- STL之类型异常处理、类型转换
- STL模板set/multiset容器插入自定义数据类型排序
- STL模板,内建函数对象(仿函数)的讲解运用和示范:greater()
- STL模板,适配器的讲解运用和示范:函数对象适配器、函数指针适配器、成员函数适配器
- C++中sizeof()运算符的的深入理解
- C++类型转换`static_cast`,`dynamic_cast`,`const_cast`,`reinterpret_cast`
- error [Makefile1689 moc_ xxxx .cpp] 解决方法
- #ifndef/#define/#endif使用详解
- Qt5 中文乱码解决
- Qt项目在Linux平台上面发布成可执行程序.run
- Qt项目在MacOS平台上面发布成可执行程序.app
- Qt项目在Windows平台上面发布成可执行程序.exe
- 【QT】Qt 5.9 QWidget程序执行过程分析
- 在子类里使用 using 父类 父类函数名fun
- 理解 C++ 中的头文件和源文件的作用
- 输出乱码原因:古文码、口字码、符号码、问号码、棍拷码
- 重绘的QStyle中sizeFromContents()没有被调用
- 项目实战:仿QQ的QQ简洁版2019群聊项目
- C++ 实现智能指针:shared_ptr 和 unique_ptr
- DTK 基础教程:自定义控件规范
- DTK常用和测试代码片
- Deepin 开发任务栏网速插件 lfxSpeed
- Deepin、DTK 文档参考资料集合
- Deepin 任务栏网速插件推荐 NetSpeed(重构 lfxSpeed)
- HOW TO BUILD QT5(5.15)
- MacOS 安装 Parallels Desktop,再安装 UOS 20 + QtCreaor,及搭建 DTK 开发环境
- Model-View-Delegate:"模型-视图-代理"的讲解
- QAbstractButton的clicked、pressed、released、toggled、triggered等信号区别
- QComboBox和QPlainTextEdit的讲解和使用
- QFileSystemModel数据模型获取本机文件系统的使用
- QNetworkAccessManager,QNetworkReply,QNetworkRequest实现高层网络的操作http
- QSlider、QScrollBar、QProgressBar控件的联动
- QString在2,8,10,16进制之间转换
- QString常用的功能函数的介绍和用法
- QStyle/DTK重绘Qt-GUI已有控件,举例QScrollBar
- QStyle/DTK重绘自定义需求控件,举例MySwitchButton
- QStyle之PenStyle的CustomDashLine使用
- QStyle自定义重绘QRubberBand控件
- QStyle自定义重绘QScrollBar
- QStyle自定义重绘QSlider控件
- QStyle自定义重绘QSlider控件二
- QStyle设置界面的外观和QCommonStyle继承关系图讲解和使用
- QTableView和QStandardItemModel(以及代理的例子)的用法
- QTableWidget表格组件的属性介绍和使用
- QTimer和QDateTime的讲解和使用
- Qt 信号和槽原理分析
- Qt 项目(CMake)设置国际化支持
- Qt4和Qt5的信号和槽的使用差异
- QtCreator 中自定义项目例子置于“欢迎-实例”中
- QtCreator此IDE的界面基本组成和入门使用讲解(Win,Linux,MacOS搭配不同版本 Qt)
- 小技巧:QtCreator用快捷键秒实现,声明在基类中重写的派生类(纯)虚函数
- Qt推倒重学系列--总目录
- Qt新弹窗不响应键盘按键,难道也是无焦点?
- Sunny 截图上架 Microsoft Store 及Linux商店的指北
- TCP通信之QTcpServer和QTcpSocket,服务器和客户端通讯
- Upd通信之QUdpSocket的unicast单播、broadcast广播、multicast组播
- VS2017调试Qt源码
- VS2022 And QtCreator10 调试 Qt 源码教程
- Win10 安装 QtCreator + Visual Studio 2015 作为 C++ 的 IDE 开发工具
- Win10 的 VMware 中安装 UOS 20,在 UOS 中安装 QtCreator 及搭建 DTK 开发环境
- Win10 安装 CLion + CMake + MSVC / MinGW 作 QT 开发
- getOpenFileName标准对话框和自定义对话框的使用
- 在Win10环境下安装QtCreator5.9.8作为c++的IDE开发工具
- 主机信息查询QHostInfo和QNetworkInterface查询IP等
- 仪表盘 QSlider + 数值显示 QLCD_NUmber 的介绍及用法
- 元对象系统 MOC (Meat-Object System) 的对象 MetaObject 和(含动态)属性 Propert 的用法
- 分享如何拥有一份私人的『开源代码签名证书』
- 列表控件QListWidget和工具按钮QToolButton的和用法
- 创建 QKeySequenceEdit() 后,显示方块■◆乱码
- 嘿嘿!开发了一款 Sunny 截图 & 钉图,亦支持“屏幕识图”和“OCR”的软件
- 在 Mac 编译成功运行 qt5.15 源码:debug 和 release 版本
- 基于 QT 开发的 FLIPPED 一款简易且漂亮的跨平台截图软件