今天在写gsyncer的UI,突然想把边框隐藏了,在网上搜了一下,直接在QMainWindow或者QDialog的构造函数中调用
this->setWIndowFlags(Qt::FramelessWindowHint); 就OK了
隐藏边框之后,发现的问题是无法拖动窗口了,于是又上网找,终于找到了如下的解决方案。
实现一个以图片边框为窗口边框的Qt程序,可以鼠标左键拖动,点击右键可以推出程序。
本程序一共三个文件,分别为shapewidget.h,shapewidget.cpp,main.cpp
自定义头文件:shapewidget.h
#ifndef SHAPEWIDGET_H #define SHAPEWIDGET_H #include <QtGui> class QPoint; //定义一个Qpoint类 class ShapeWidget : public QWidget //ShaoeWidget继承了QWidget { Q_OBJECT public: ShapeWidget(QWidget *parent=0); //创建一个空内容的构造函数 protected: void mousePressEvent(QMouseEvent *); //自定义一个鼠标点击事件函数 void mouseMoveEvent(QMouseEvent *); //自定义一个鼠标拖动事件函数 void paintEvent(QPaintEvent *); //自定义一个刷屏事件函数 private: QPoint dragPosition; //定义一个QPoint的成员变量 }; #endif
实现文件:shapewidget.cpp
#include "shapewidget.h" ShapeWidget::ShapeWidget(QWidget *parent) //外部重写构造函数 : QWidget(parent,Qt::FramelessWindowHint) //初始化参数类型 { QPixmap pix; //设置一个QPixmap的对象。 pix.load(":/images/Watermelon.png",0,Qt::AvoidDither|Qt::ThresholdDither|Qt::ThresholdAlphaDither); resize(pix.size()); //设置窗口的尺寸为图片的尺寸 setMask(pix.mask()); //先通过pix的方法获得图片的过滤掉透明的部分得到的图片,作为shapeWidget的不规则边框。 setWindowOpacity(0.8); //设置图片透明度 } void ShapeWidget::mousePressEvent(QMouseEvent * event) { if (event->button() == Qt::LeftButton) //点击左边鼠标 { dragPosition = event->globalPos() - frameGeometry().topLeft(); //globalPos()获取根窗口的相对路径,frameGeometry().topLeft()获取主窗口左上角的位置 event->accept(); //鼠标事件被系统接收 } if (event->button() == Qt::RightButton) { close(); } } void ShapeWidget::mouseMoveEvent(QMouseEvent * event) { if (event->buttons() == Qt::LeftButton) //当满足鼠标左键被点击时。 { move(event->globalPos() - dragPosition);//移动窗口 event->accept(); } } void ShapeWidget::paintEvent(QPaintEvent *) { QPainter painter(this);//创建一个QPainter对象 painter.drawPixmap(0,0,QPixmap(":/images/Watermelon.png"));//绘制图片到窗口 /* QPixmap(":/images/Watermelon.png")如果改为QPixmap(),则只能看到绘制出的框架,看不到图片颜色,也就是看不到图片。 */ }
主函数:main.cpp
#include <QApplication> #include "shapewidget.h" int main(int argc, char * argv[]) { QApplication app(argc,argv); ShapeWidget shape; shape.show(); return app.exec(); }