繼續我們的左側導航欄/主按鈕欄,随便叫啥吧,這裡主要用的是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");;
}
打開應用程序也可使用
-> 其他
當然可以如上圖片增加添加按鈕,允許用戶選擇,通過QFileDialog::getOpenFileName打開選擇文件對話框,需注意對話框裡的多個filter是雙逗号分割的,如"Images (*.png *.xpm *.jpg);;Text files (*.txt);;XML files (*.xml)" ---來自QT幫助文檔
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!