运行效果
基于Qt实现不规则窗体,网上的教程千篇一律都是使用遮罩实现的,就像下面这样:
m_Pixmap.load("delete.png");
resize( m_Pixmap.size() );
setMask( m_Pixmap.mask() );
虽然这样做确实可以实现不规则窗体,但是我想自己通过绘图事件来绘制不规则窗体,而不是使用图片,这样自由度就大一些,就可以更快乐的玩耍了,所以我想借鉴双缓冲绘图原理,先在QPixmap上绘制,然后再将QPixmap绘制到窗体上,再设置遮罩,就像这样:
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
pixmap = new QPixmap(200,200);
paint();
QBitmap bitmap = pixmap->mask();
setMask(bitmap);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.drawPixmap(100,100,*pixmap);
}
void MainWindow::paint()
{
QPainter painter(pixmap);
painter.setPen(QColor(255,0,0));
painter.drawEllipse(0,0,200,200);
}
但是一运行,根本没什么用,我功力尚浅,不知道在哪个环节出了问题,希望有知道的大佬指出来,让我也学习学习!
通过查阅得知了一种新的办法:将窗体设置为透明,但是控件不受影响,主要是添加如下代码:
setWindowFlags(Qt::FramelessWindowHint);
setAttribute(Qt::WA_TranslucentBackground);
这里使用了setAttribute()函数指定窗口的Qt::WA_TranslucentBackground
属性,它可以使窗体背景透明,而其中的部件不受影响。不过在Windows下,还要使用setWindowFlags()
函数指定Qt::FramelessWindowHint
标志,这样才能实现透明效果。
其它的就照常绘图就完事了,加上上面那两行代码就行!