目录
原理
在Web界面里面,可以看到,web前端程序员喜欢用一些淡淡的底纹(非背景),在此我也想实现下CS模型里面,Qt实现底纹功能!
程序运行截图如下:
底纹是这样的!
这里来展示一下动态图:
这里的原理如下:
重写这个painterEvent这个函数,实时获取窗体长和宽,并且是向上取整!然后再依次画图,是不是很简单的思路:
void paintEvent(QPaintEvent *event) Q_DECL_OVERRIDE;
这里是说明一点:
void paintEvent(QPaintEvent *event) Q_DECL_OVERRIDE;
是在事件循环中的(估计最后调用了Windows消息机制(Windows端)),他可以手动触发,也可以被动触发!
但在拖动窗体大小前:
void resizeEvent(QResizeEvent *event) Q_DECL_OVERRIDE;
这个函数是会被提取触发的!
下面说一下第二个知识点,如何设置控件的透明度!
这里有一个函数是setWindowOpacity(),这函数是设置窗体透明度,学Qt的都知道,控件都是窗体,理论上是有效果的,但设置这个并没有什么用,因为Qt有个继承树机制,他的透明度由他父类决定,所以设置这个是然并卵!
但可以采用QSS进行设置,颜色有rgba,通过设置α通道即可:
background-color:rgba(255, 255, 255, 150)
关键代码
QSS
QTreeView{
background-color:rgba(255, 255, 255, 150)
}
QPushButton{
background-color:rgba(255, 255, 255, 150)
}
QLineEdit{
background-color:rgba(255, 255, 255, 150)
}
关键的三个函数:
void resizeEvent(QResizeEvent *event) Q_DECL_OVERRIDE;
void setShadingNum();
void paintEvent(QPaintEvent *event) Q_DECL_OVERRIDE;
void MainWindow::setShadingNum()
{
m_shadingWidthNum = qCeil(width() / (float)QPixmap(":/img/shading.png").width());
m_shadingHeightNum = qCeil(height() / (float)QPixmap(":/img/shading.png").height());
}
void MainWindow::resizeEvent(QResizeEvent *event)
{
setShadingNum();
QMainWindow::resizeEvent(event);
}
void MainWindow::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
painter.setBrush(QBrush(Qt::white));
//set Shading
QPixmap pixmap(":/img/shading.png");
int startDrawX = 0;
int startDrawY = 0;
painter.setPen(Qt::black);
QRect rect = this->rect();
rect.setWidth(rect.width() - 1);
rect.setHeight(rect.height() - 1);
painter.drawRoundedRect(rect, 30, 30);
painter.setPen(Qt::red);
painter.drawPixmap(rect.width() - LABLESIZE16, rect.height() - LABLESIZE16
, QPixmap(":/img/dot_blue.png").scaled(LABLESIZE16, LABLESIZE16));
for(int i = 0; i < m_shadingHeightNum; i++){
for(int j = 0; j < m_shadingWidthNum; j++){
painter.drawPixmap(startDrawX, startDrawY, pixmap);
startDrawX += pixmap.width();
}
startDrawX = 0;
startDrawY += pixmap.height();
}
QMainWindow::paintEvent(event);
}