百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

QT学习笔记二 之 导航栏(运行第三方程序和获取图标)

csdh11 2025-03-05 15:00 16 浏览

继续我们的左侧导航栏/主按钮栏,随便叫啥吧,这里主要用的是QDockWidget。

-> 第一次惯例: 介绍

介绍下QDockWidget是可以停靠在主窗口(QMainWindows->CentralWidget)四周或者悬浮的特殊窗体,可停靠区域如下图(来自QT说明文档)

setFeatures()设置特性(关闭,移动,悬浮等),

setAllowedAreas()设置可停靠区域(上下左右和全部区域),前提必须要设置特性为可移动。

之后在MainWindows里添加即可addDockWidget(Qt::LeftDockWidgetArea, mLeftItemsWidget);

-> 主题

目标:允许用户拖拽或添加其他应用程序或文件等等并点击打开,如下图:

新建类leftItemsWidget继承QDockWidget, 特别注意Q_OBJECT,文档中强调使用信号槽或者其他meta-objectmust必须放置Q_OBJECT

class leftItemsWidget : public QDockWidget
{
  Q_OBJECT
  QGridLayout * gridLayout;
  const int BTNSIZE = 48;//按钮大小
  const int X = 2;//x轴原点间隔
  const int Y = 25;//Y轴原点距离
  const int GAP_Y = 2;//按钮间间隔
  int btnsCount=0;//统计按钮数量,计算位置
  void add(const QString & name, const QIcon & icon, const QString & whatisthis="");//添加按钮
private slots:
  void onClicked(bool b);//按钮点击
protected:
  void dropEvent(QDropEvent *event) Q_DECL_OVERRIDE;//重写拽入后释放
  void dragEnterEvent(QDragEnterEvent *event) Q_DECL_OVERRIDE;//重写拽入
}

在构造函数里固定宽度,并设置Dock特性,同时设置允许拖拽

leftItemsWidget::leftItemsWidget(QWidget *parent) :QDockWidget(parent)
{
  this->setFixedWidth(52);//固定宽度
  this->setAcceptDrops(true);//允许拖拽
  this->setFeatures(QDockWidget::DockWidgetFloatable | QDockWidget::DockWidgetMovable);
  this->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
}

实现拖入代码, DropAction分为Qt::LinkAction,Qt::MoveAction,Qt::CopyAction等

void leftItemsWidget::dragEnterEvent(QDragEnterEvent *event)
{
  event->setDropAction(Qt::LinkAction);//设置为link
  event->accept();//接受
}
void leftItemsWidget::dropEvent(QDropEvent *event)
{
  QStringList linkes = event->mimeData()->text().split("\n");//获取数据
  for(int i=0; i<linkes.size(); i++)
  {
    addSource(linkes.at(i));//这个解析路径后获取各文件图标并添加按钮
  }
}

传入的路径都为"file:///xxxxxx",在获取图标时但Mac和windows稍微有差别

void leftItemsWidget::addSource(const QString & sourcePath)
{
  QString source;
  if(sourcePath.startsWith("file:///"))
  {
#ifdef Q_OS_MAC
  source = sourcePath.last(sourcePath.count()-7);//mac文件路径需要最前面的/
#else
  source = sourcePath.last(sourcePath.count()-8);//windows不需要
#endif
  }
  QFileInfo filetmp(source);
  QFileIconProvider iconProvider;
  QIcon icon = iconProvider.icon(filetmp);//获取文件或应用程序的图标
  add(filetmp.fileName(), icon, sourcePath);//添加按钮展示
}

iconProvider.icon(filetmp)可以继续获取各种尺寸,如iconProvider.icon(filetmp).pixmap(32,32);

void leftItemsWidget::add(const QString & name, const QIcon & icon, bool group, const QString & whatisthis)
{
  QPushButton * btn = new QPushButton(this);
  btn->setWhatsThis(whatisthis);//设置what'sthis 帮助
  btn->setMinimumSize(BTNSIZE,BTNSIZE);//设置大小
  btn->setMaximumSize(BTNSIZE,BTNSIZE);
  btn->setIcon(icon);//设置图标
  btn->setIconSize(QSize(BTNSIZE,BTNSIZE));//设置图标尺寸
  btn->show();//显示,必须的
  btn->setStyleSheet("QPushButton{color: rgb(255, 255, 255);border-color: rgb(255, 255, 255);border-style:solid;}""QToolTip{color:rgb(0,0,0);font-size:13px}");//设置按钮颜色等,tooltip颜色和字体大小
  connect(btn, SIGNAL(clicked(bool)), this, SLOT(onClicked(bool)));//连接信号槽
  btn->setGeometry(X, Y+btnsCount*(GAP_Y+BTNSIZE), BTNSIZE,BTNSIZE);//设置位置
  btnsCount++;
  btn->setToolTip(name);//设置当鼠标停靠时显示的说明信息
}

按钮点击时打开文件或运行应用程序

void leftItemsWidget::onClicked(bool b)
{
  QPushButton * curr = (QPushButton*)(QObject::sender());//获取信号源,也就是哪个按钮被点击了
  QString ss = curr->whatsThis();
  bool b = QDesktopServices::openUrl(QUrl(ss));//ss需为绝对路径
  qDebug()<<QString("%1 : %2")ss, b?"Success":"Error");;
}

打开应用程序也可使用

  1. 非阻塞void QProcess::start(const QString &program, const QStringList &arguments = {}, QIODeviceBase::OpenMode mode = ReadWrite)
  2. 阻塞int QProcess::execute(const QString &program, const QStringList &arguments = {})等待结束并返回结果。

-> 其他

当然可以如上图片增加添加按钮,允许用户选择,通过
QFileDialog::getOpenFileName打开选择文件对话框,需注意对话框里的多个filter是双逗号分割的,如"Images (*.png *.xpm *.jpg);;Text files (*.txt);;XML files (*.xml)" ---来自QT帮助文档

相关推荐

用Python轻松修改Word文件的作者和时间,打造自己的专属效率工具

你是否曾经遇到过需要批量修改Word文件的作者、创建时间或修改时间的情况?手动操作不仅费时费力,还容易出错。可以用Python编写一个小工具,轻松解决这个问题!无论你是编程新手还是有一定经验的...

插件开发js代码划分(js插件编写)

在开发Chrome插件时,将JavaScript代码拆分成多个模块而非集中放置,主要基于性能优化、可维护性提升和浏览器插件特性适配等多方面的考量。以下是具体原因及区别分析:一、拆分的核心原因...

5分钟掌握Python中的标准输入、标准输出、标准错误

读取用户输入从标准输入获取输入:user_input=input("Impartyourwisdom:")print(f"Youshared:{user_input}")...

高大上的解答:在 &#39;packages.pyi&#39; 中找不到引用 &#39;urllib3&#39;

DeepSeek的一句代码:...

Flask 入门教程(flask快速入门)

目录什么是Flask?环境配置与安装第一个Flask应用:HelloWorld路由与视图函数模板与Jinja2表单处理与用户输入...

每日一库之 Go 语言开发者的神器—Gotx

点击上方蓝色“Go语言中文网”关注我们,领全套Go资料,每天学习Go语言简介Gotx是一个Go语言(Golang)的解释器和运行环境,只有单个可执行文件,绿色、跨平台,无需安装任何Go语言环境就可...

MySQL性能调优工具包制作(mysql性能调整)

一、最终工具包内容mysql_tuning_toolkit/├──scripts/#核心脚本│├──sysbench-pro.sh#...

掌握TensorFlow核心用法:从安装到实战的完整指南

一、为什么TensorFlow值得学习?作为全球使用最广泛的开源机器学习框架,TensorFlow已累计获得超过17万GitHub星标,支撑着Google搜索、Waymo自动驾驶、NASA卫星图像分析...

如何把PY 打包成EXE安装文件(pypy 打包exe)

将Python脚本打包成EXE文件通常使用第三方工具实现,以下是详细步骤和注意事项:...

Pygame Zero 详细使用教程(python zerorpc)

PygameZero是一个基于Pygame的简化游戏开发框架,特别适合初学者和快速原型开发。它隐藏了许多底层的复杂性,使得开发者可以更专注于游戏逻辑的实现。本文将通过分析提供的代码,详细介绍如...

Stable diffusion AI画图辅助脚本 Script 的使用(二)

本篇为脚本使用介绍的第二部分,主要介绍Promptmatrix提示词矩阵以及UltimateSDUpscale终极SD放大这两个脚本,同时也简单介绍一下如何编写自己的脚本。1、Promp...

一文明白Python 的import如何工作

Pythonimport系统的基础知识Python的import系统是该语言设计的关键部分,允许模块化编程和代码的轻松重用。了解这个系统对任何Python程序员都很重要,因为它决定了代码的结构...

Highlight.js - 前端的代码语法高亮库

千辛万苦写了篇技术分享,贴了一堆代码,兴高采烈地发到了自己的博客网站上。结果却发现代码全是白底黑字,字体还难看得很,你瞬间就没了兴致。能不能让网页也能像IDE那样,做带语法高亮的炫酷显示呢?来看一...

xbox xsx/s ps2模拟器 战神12,北欧女神2 配置教程

xsxxss下载PS2独立模拟器,Retroarch全能模拟器地址。...

RetroArch 着色器、金手指怎么用? 重返复古游戏萤幕滤镜效果

自从上次分享RetroArch模拟器的一些技巧后,许多模拟器新用户对老旧游戏机感到好奇,为什么游戏画面看起来会有很多马赛克。这主要是因为当年的游戏开发商是针对当时的屏幕进行设计的,所以在现在的高分辨率...