网站首页 > 编程文章 正文
继续我们的左侧导航栏/主按钮栏,随便叫啥吧,这里主要用的是QDockWidget。
-> 第一次惯例: 介绍
介绍下QDockWidget是可以停靠在主窗口(QMainWindows->CentralWidget)四周或者悬浮的特殊窗体,可停靠区域如下图(来自QT说明文档)
setFeatures()设置特性(关闭,移动,悬浮等),
setAllowedAreas()设置可停靠区域(上下左右和全部区域),前提必须要设置特性为可移动。
之后在MainWindows里添加即可addDockWidget(Qt::LeftDockWidgetArea, mLeftItemsWidget);
-> 主题
目标:允许用户拖拽或添加其他应用程序或文件等等并点击打开,如下图:
新建类leftItemsWidget继承QDockWidget, 特别注意Q_OBJECT,文档中强调使用信号槽或者其他meta-object就must必须放置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");;
}
打开应用程序也可使用
- 非阻塞void QProcess::start(const QString &program, const QStringList &arguments = {}, QIODeviceBase::OpenMode mode = ReadWrite)
- 阻塞int QProcess::execute(const QString &program, const QStringList &arguments = {})等待结束并返回结果。
-> 其他
当然可以如上图片增加添加按钮,允许用户选择,通过QFileDialog::getOpenFileName打开选择文件对话框,需注意对话框里的多个filter是双逗号分割的,如"Images (*.png *.xpm *.jpg);;Text files (*.txt);;XML files (*.xml)" ---来自QT帮助文档
猜你喜欢
- 2024-10-14 「Qt入门第31篇」 网络(一)Qt网络编程简介
- 2024-10-14 qt 做手机android的串口通讯 qt下串口通信
- 2024-10-14 Qt 读写txt文本文件(qt读入文件)
- 2024-10-14 Qt 信号槽连接不成功问题原因汇总
- 2024-10-14 QML 性能优化建议(一)(qml例程)
- 2024-10-14 C++ QT中文件的读写操作(UI界面)(qt怎么读取文件内容)
- 2024-10-14 Qt 中的智能指针(qt 函数指针)
- 2024-10-14 Qt如何读取和写入配置文件的数据(qt 读写配置文件)
- 2024-10-14 Qt pro文件中的常用宏说明(qt pro 自定义宏)
- 2024-10-14 Qt应用程序主窗口:拖放操作与打印文档
你 发表评论:
欢迎- 05-09Spring Boot3 RESTful 接口参数校验,这篇吃透就够了!
- 05-09《Spring6》第02节:基于XML方式搭建Spring6框架开发环境
- 05-09MapStruct架构设计(mapstruct @mapping)
- 05-09分布式微服务架构组件(分布式微服务架构设计)
- 05-09Java Swing组件下的JButton实例(java swing 组件)
- 05-09java基础都在这了,小主们拿去吧(java基础是指什么)
- 05-09AOP的实现落地(拦截过滤),一切都要从Servlet说起
- 05-09【Spring Boot】WebSocket 的 6 种集成方式
- 最近发表
-
- Spring Boot3 RESTful 接口参数校验,这篇吃透就够了!
- 《Spring6》第02节:基于XML方式搭建Spring6框架开发环境
- MapStruct架构设计(mapstruct @mapping)
- 分布式微服务架构组件(分布式微服务架构设计)
- Java Swing组件下的JButton实例(java swing 组件)
- java基础都在这了,小主们拿去吧(java基础是指什么)
- AOP的实现落地(拦截过滤),一切都要从Servlet说起
- 【Spring Boot】WebSocket 的 6 种集成方式
- Java 中五种最常见加密算法:原理、应用与代码实现
- 用注解进行参数校验,spring validation介绍、使用、实现原理分析
- 标签列表
-
- spire.doc (59)
- system.data.oracleclient (61)
- 按键小精灵源码提取 (66)
- pyqt5designer教程 (65)
- 联想刷bios工具 (66)
- c#源码 (64)
- graphics.h头文件 (62)
- mysqldump下载 (66)
- sqljdbc4.jar下载 (56)
- libmp3lame (60)
- maven3.3.9 (63)
- 二调符号库 (57)
- 苹果ios字体下载 (56)
- git.exe下载 (68)
- diskgenius_winpe (72)
- pythoncrc16 (57)
- solidworks宏文件下载 (59)
- qt帮助文档中文版 (73)
- satacontroller (66)
- hgcad (64)
- bootimg.exe (69)
- android-gif-drawable (62)
- axure9元件库免费下载 (57)
- libmysqlclient.so.18 (58)
- springbootdemo (64)
本文暂时没有评论,来添加一个吧(●'◡'●)