1. 程式人生 > >【QT】QT從零入門教程(十一):QT自定義視窗

【QT】QT從零入門教程(十一):QT自定義視窗

  首先是借鑑了網上的部落格,實現無邊框,自由拖動的自定義視窗效果。

#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():顯示一個模態對話方塊,鎖住程式直到使用者關閉該對話方塊為止。意味著在彈出視窗的時候,整個程式就被鎖定了,處於等待狀態,直到該視窗被關閉,在這個過程中不能對主視窗進行操作。