tft每日頭條

 > 生活

 > qt代碼布局技巧

qt代碼布局技巧

生活 更新时间:2024-07-21 08:16:15

繼續我們的左側導航欄/主按鈕欄,随便叫啥吧,這裡主要用的是QDockWidget。

-> 第一次慣例: 介紹

介紹下QDockWidget是可以停靠在主窗口(QMainWindows->CentralWidget)四周或者懸浮的特殊窗體,可停靠區域如下圖(來自QT說明文檔)

qt代碼布局技巧(QT學習筆記二之導航欄)1

setFeatures()設置特性(關閉,移動,懸浮等),

setAllowedAreas()設置可停靠區域(上下左右和全部區域),前提必須要設置特性為可移動。

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

-> 主題

目标:允許用戶拖拽或添加其他應用程序或文件等等并點擊打開,如下圖:

qt代碼布局技巧(QT學習筆記二之導航欄)2

新建類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");; }

qt代碼布局技巧(QT學習筆記二之導航欄)3

打開應用程序也可使用

  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幫助文檔

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved