【QT】QT從零入門教程(十一):QT自定義視窗
阿新 • • 發佈:2019-01-09
首先是借鑑了網上的部落格,實現無邊框,自由拖動的自定義視窗效果。
#ifndef CUSTOMWINDOW_H
#define CUSTOMWINDOW_H
#include <QtGui>
#include <QtWidgets>
#include <QMenuBar>
#include <QMainWindow>
class CustomWindow : public QDialog
{
Q_OBJECT
public:
CustomWindow(QWidget *parent = 0);
~CustomWindow();
protected :
virtual void mousePressEvent(QMouseEvent *event);
virtual void mouseMoveEvent(QMouseEvent *event);
virtual void mouseReleaseEvent(QMouseEvent *event);
private:
bool mMoveing;
QPoint mMovePosition;
};
#endif // CUSTOMWINDOW_H
#include <QtGui>
#include <QtWidgets>
#include <QMenuBar>
#include <QMainWindow>
#include "header/CustomWindow.h"
CustomWindow::CustomWindow(QWidget *parent)
{
mMoveing = false;
//Qt::FramelessWindowHint 無邊框
//Qt::WindowStaysOnTopHint 視窗在最頂端,不會拖到工作列下面
setWindowFlags(Qt::FramelessWindowHint | Qt::WindowMinimizeButtonHint | Qt::WindowStaysOnTopHint);
}
CustomWindow::~CustomWindow()
{
}
//重寫滑鼠按下事件
void CustomWindow::mousePressEvent(QMouseEvent *event)
{
mMoveing = true;
//記錄下滑鼠相對於視窗的位置
//event->globalPos()滑鼠按下時,滑鼠相對於整個螢幕位置
//pos() this->pos()滑鼠按下時,視窗相對於整個螢幕位置
mMovePosition = event->globalPos() - pos();
return QDialog::mousePressEvent(event);
}
//重寫滑鼠移動事件
void CustomWindow::mouseMoveEvent(QMouseEvent *event)
{
//(event->buttons() && Qt::LeftButton)按下是左鍵
//滑鼠移動事件需要移動視窗,視窗移動到哪裡呢?就是要獲取滑鼠移動中,視窗在整個螢幕的座標,然後move到這個座標,怎麼獲取座標?
//通過事件event->globalPos()知道滑鼠座標,滑鼠座標減去滑鼠相對於視窗位置,就是視窗在整個螢幕的座標
if (mMoveing && (event->buttons() && Qt::LeftButton)
&& (event->globalPos() - mMovePosition).manhattanLength() > QApplication::startDragDistance())
{
move(event->globalPos() - mMovePosition);
mMovePosition = event->globalPos() - pos();
}
return QDialog::mouseMoveEvent(event);
}
void CustomWindow::mouseReleaseEvent(QMouseEvent *event)
{
mMoveing = false;
}
例項
接下來是使用這個CustomWindow類的方法與例項:
// 在“影象處理自編系統”中,“預覽”視窗及“關於”彈窗都用到了自定義視窗
// 為方便演示,在工具欄上加一按鈕,以“關於”為例。
QPushButton *button = new QPushButton(tr("關於"));
ui.mainToolBar->addWidget(button);
connect(button, SIGNAL(clicked()), this, SLOT(showWin()));
// 下面完善槽函式
void mainWindow::showWin()
{
CustomWindow *helpWin = new CustomWindow(); // 此處對類進行例項化
helpWin->resize(600, 400); // 設定影象大小
QLabel *label_about = new QLabel(helpWin);
label_about->setText(tr("影象處理自編軟體 1.0 版"));
QLabel *label_right = new QLabel(helpWin);
label_right->setText(tr("Copyright (C) 2018 深圳 ATR"));
QLabel *label_author = new QLabel(helpWin);
label_author->setText(tr("作者:筆尖 http://blog.csdn.net/u013165921"));
QPushButton *button_ok = new QPushButton(helpWin);
button_ok->setText(tr("確定"));
connect(button_ok, SIGNAL(clicked()), helpWin, SLOT(close()));
label_about->move(100, 100);
label_right->move(100, 180);
label_author->move(100, 260);
button_ok->move(400, 180);
helpWin->exec(); // 模態對話方塊,關閉該子視窗前不能對主視窗進行任何操作。
}
我們來看一下執行結果:
show()與exec()
這裡介紹一下show()與exec()的區別
show():顯示一個非模態對話方塊,控制權即刻返回給呼叫函式。可以一起操作主視窗與子視窗。
exec():顯示一個模態對話方塊,鎖住程式直到使用者關閉該對話方塊為止。意味著在彈出視窗的時候,整個程式就被鎖定了,處於等待狀態,直到該視窗被關閉,在這個過程中不能對主視窗進行操作。