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

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

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

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

相关推荐

网站seo该怎么优化

一、网站定位在建设一个网站之前,我们首先要做的就是一个网站清晰的定位,会带来转化率相对较高的客户群体,我们建站的目的就是为了营销,只有集中来做某一件事,才会更好的展现我们的网站。在做SEO优化的同时...

3个小技巧教你如何做好SEO优化

  想半路出家做SEO?可是,怎么才做的好呢?关于SEO专业技术弄懂搜索引擎原理,咱们做搜索引擎排名的首先就是要了解搜索引擎的工作原理,对SEO优化有更深入了解之后再来做SEO,你就能从搜索引擎的视点...

SEO指令分享:filetype指令

filetype用于搜索特定的文件格式。百度和谷歌都支持filetype指令。比如搜索filetype:pdf今日头条返回的就是包含今日头条这个关键词的所有pdf文件,如下图:百度只支持:pdf...

网站seo优化技巧大全

SEO在搜索引擎中对检索结果进行排序,看谁最初是在用户的第一眼中看到的。实际上,这些排名都是通过引擎的内部算法来实现的。例如,百度算法很有名。那么,对百度SEO的优化有哪些小技巧?下面小编就会说下针对...

小技巧#10 某些高级的搜索技巧

由于某些原因,我的实验场所仅限百度。1.关键词+空格严格说来这个不能算高级,但关键词之间打空格的办法确实好用。我习惯用右手大拇指外侧敲击空格键,这个习惯在打英文报告时尤其频繁。2.site:(请不要忽...

MYSQL数据库权限与安全

权限与安全数据库的权限和数据库的安全是息息相关的,不当的权限设置可能会导致各种各样的安全隐患,操作系统的某些设置也会对MySQL的安全造成影响。1、权限系统的工作原理...

WPF样式

UniformGrid容器<UniformGridColumns="3"Rows="3"><Button/>...

mysql自动备份,并zabbix检测备份文件是否正常,备份文件大小

推荐...

MySQL学到什么程度?才有可以在简历上写精通

前言如今互联网行业用的最多就是MySQL,然而对于高级Web面试者,尤其对于寻找30k下工作的求职者,很多MySQL相关知识点基本都会涉及,如果面试中,你的相关知识答的模糊和不切要点,基...

jquery的事件名称和命名空间的方法

我们先看一些代码:当然,我们也可以用bind进行事件绑定。我们看到上面的代码,我们可以在事件后面,以点号,加我们的名字,就是事件命名空间。所谓事件命名空间,就是事件类型后面以点语法附加一个别名,以便引...

c#,委托与事件,发布订阅模型,观察者模式

什么是事件?事件(Event)基本上说是一个用户操作,如按键、点击、鼠标移动等等,或者是一些提示信息,如系统生成的通知。应用程序需要在事件发生时响应事件。通过委托使用事件事件在类中声明且生成,且通过...

前端分享-原生Popover已经支持

传统网页弹窗开发需要自己处理z-index层级冲突、编写点击外部关闭的逻辑、管理多个弹窗的堆叠顺序。核心优势对比:...

Axure 8.0 综合帖——新增细节内容

一、钢笔工具与PS或者AI中的钢笔工具一样的用法。同样有手柄和锚点,如果终点和起点没有接合在一起,只要双击鼠标左键即可完成绘画。画出来的是矢量图,可以理解为新的元件。不建议通过这个工具来画ICON图等...

PostgreSQL技术内幕28:触发器实现原理

0.简介在PostgreSQL(简称PG)数据库中,触发器(Trigger)能够在特定的数据库数据变化事件(如插入、更新、删除等)或数据库事件(DDL)发生时自动执行预定义的操作。触发器的实现原理涉及...

UWP开发入门(十七)--判断设备类型及响应VirtualKey

蜀黍我做的工作跟IM软件有关,UWP同时会跑在电脑和手机上。电脑和手机的使用习惯不尽一致,通常我倾向于根据窗口尺寸来进行布局的变化,但是特定的操作习惯是依赖于设备类型,而不是屏幕尺寸的,比如聊天窗口的...