插入背景图片的实现方法
在构造函数中添加:
setWindowFlags(Qt::FramelessWindowHint);
setWindowOpacity(1);
QPixmap pixmap = QPixmap(":/Image/login.png").scaled(this->size());
QPalette palette(this->palette());
palette.setBrush(QPalette::Background, QBrush(pixmap));
this->setPalette(palette);
不规则窗体的实现方法
此方法需要重写paintEvent函数,进行背景的绘制:
//在头文件中添加
private:
QPixmap pic;
virtual void paintEvent(QPaintEvent *paintevent);
//在构造函数中添加
setWindowFlags(Qt::FramelessWindowHint);//设置窗体无边框
setAttribute(Qt::WA_TranslucentBackground);//设置背景透明
pic.load(tr(":/Image/login.png"));//login.png的背景是透明的,网上下载图片或用PS很容易就能做出来
resize(pic.size());//设置图像的大小
//实现paintEvent函数
void CLogin::paintEvent(QPaintEvent *paintevent)
{
paintevent->ignore();
QPainter painter(this);
painter.drawPixmap(0, 0, pic);//绘制图像
}
这样窗口是创建好了,但是窗口是无法移动的,所以还要重载鼠标事件:
//重写三个鼠标事件来实现窗口移动
private:
bool m_Drag;//记录鼠标是否按下
QPoint m_DragPosition;//记录鼠标位置
virtual void mousePressEvent(QMouseEvent *event);
virtual void mouseMoveEvent(QMouseEvent *event);
virtual void mouseReleaseEvent(QMouseEvent *event);
void CLogin::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton)
{
m_Drag = true;
//event->globalPos()获取的鼠标位置是鼠标偏离电脑屏幕左上角(x=0,y=0)的位置
//pos()获取的位置是主窗口(widget窗口)左上角(边框的左上角,外左上角)相对于电脑屏幕的左上角的(x=0,y=0)偏移位置
m_DragPosition = event->globalPos() - this->pos();
event->accept();
}
}
void CLogin::mouseMoveEvent(QMouseEvent *event)
{
if (m_Drag && (event->buttons() && Qt::LeftButton))//注意这里是event->buttons(),不是event->button()
{
move(event->globalPos() - m_DragPosition);
event->accept();
}
}
void CLogin::mouseReleaseEvent(QMouseEvent *event)
{
m_Drag=false;
}
但是因为没有边框,所以关闭按钮,最小化按钮都要自己加进去,下面是添加关闭按钮的例子:
//在构造函数中添加
int wide = width();//获取界面的宽度
QToolButton *closeButton= new QToolButton(this);//构建关闭按钮
QPixmap closePix;
closePix.load(tr(":/Image/close.png"));
closeButton->setIcon(closePix);//设置关闭按钮图标
closeButton->setGeometry(wide-104,180,35,35);//设置关闭按钮在界面的位置
closeButton->setToolTip(tr("关闭"));//设置鼠标移至按钮上的提示信息
closeButton->setStyleSheet("background-color:transparent;");//设置关闭按钮的样式
connect(closeButton, SIGNAL(clicked()), this, SLOT(close()));
窗体效果如下图所示: