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

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

haoteby 2024-12-09 12:48 11 浏览

继续我们的左侧导航栏/主按钮栏,随便叫啥吧,这里主要用的是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帮助文档

相关推荐

Chrome OS 41 用 Freon 取代 X11_chrome os atom

在刚发布的ChromeOS41里,除了常规的Wi-Fi稳定性提升(几乎所有系统的changelog里都会包含这一项)、访客模式壁纸等之外,还存在底层改变。这一更新中Google移除...

苹果iPad Pro再曝光 有望今年六月发布

自进入2015年以后,有关大屏iPad的消息便一直不绝于耳,之前就有不少媒体猜想这款全新的平板电脑将会在三月发布,不过可惜的是我么只在那次发布会上看到了MacBookPro。近日@Ubuntu团队便...

雷卯针对香橙派Orange Pi 5 Max开发板防雷防静电方案

一、应用场景高端平板、边缘计算、人工智能、云计算、AR/VR、智能安防、智能家居、Linux桌面计算机、Linux网络服务器、Android平板、Android游戏机...

Ubuntu Server无法更新问题解决_ubuntu server not found

上周老家的一台运行UbuntuServer的盒子无法连接上了,中秋这两天回来打开,顺手更新一下发现更新报错。提示`E:Releasefileforhttps://mirrors.aliyun...

虚幻引擎5正式版发布:古墓丽影&amp;巫师新作采用、新一代实时渲染

机器之心报道编辑:杜伟、陈萍虚幻引擎5的目标是「助力各种规模的团队在视觉领域和互动领域挑战极限,施展无限潜能」。...

AMD Milan-X双路霄龙7773X平台基准测试曝光 CPU缓存总量超1.5GB

OpenBenchmarking基准测试数据库刚刚曝光了AMDMilan-X双路霄龙7773X平台的跑分成绩,虽然很快就被撤下,但我们还是知晓了高达1.6GB的总CPU缓存。早些时...

ROS机器人建模_ros机器人硬件搭建

...

全网最新的Dify(1.7.2)私有化离线部署教程(ARM架构)

Hello,大家好!近期工作中有涉及到Dify私有化离线部署,特别是针对于一些国产设备。因此特别整理了该教程,实测有效!有需要的小伙伴可以参考下!本文主要针对Dify1.7.2最新版本+国产操作系...

在ubuntu下新建asp.net core项目_创建ubuntu

本文一步步讲述在ubuntu下用visualstudiocode创建asp.netcore项目的过程。step1:环境操作系统:virtualbox下安装的lubuntu。请不要开启“硬件...

在晶晨A311D2处理器上进行Linux硬件视频编码
在晶晨A311D2处理器上进行Linux硬件视频编码

在KhadasVIM4AmogicA311D2SBC上,我更多的时间是在使用Ubuntu22.04。它的总体性能还不错,只不过缺少3D图形加速和硬件视...

2025-08-26 17:22 haoteby

Nacos3.0重磅来袭!全面拥抱AI,单机及集群模式安装详细教程!

之前和大家分享过JDK17的多版本管理及详细安装过程,然后在项目升级完jdk17后又发现之前的注册和配置中心nacos又用不了,原因是之前的nacos1.3版本的,版本太老了,已经无法适配当前新的JD...

电影质量级渲染来了!虚幻引擎5.3正式发布:已开放下载

快科技9月8日消息,日前,Unrealengine正式发布了虚幻引擎5.3,带来了大量全方位的改进。...

2025如何选购办公电脑?极摩客mini主机英特尔系列选购指南

当下,迷你主机的性能越来越强,品类也越来越多。但是CPU是不变的,基本都是AMD和英特尔的。有一个小伙伴在评论区提问,我应该如何在众多机器中选购一台符合自己的迷你主机呢?那今天我们优先把我们的系列,分...

ubuntu 20.04+RTX4060 Ti+CUDA 11.7+cudnn

ububtu添加国内源sudocp/etc/apt/sources.list/etc/apt/sources.list.backupsudovim/etc/apt/sources.lis...

Linux Mint 18将重新基于Ubuntu 16.04 带来更好硬件支持

项目负责人ClementLefebvre在本月6日披露了关于LinuxMint18“Sarah”操作系统的大量信息,包括带来全新扁平化体验的Mint-Y主题。而现在,这款将于年底之前上线的操作...