赞
踩
自定义窗口,该窗口包含标题栏,默认整个窗口的边框线为蓝色,当点击该窗口的时候,窗口的边框线便为红色。程序在运行的时候,窗口的边框线只显示了左右两边的线,没有显示上下边的线。
效果:
针对上面窗口只显示左右两边,不显示上下两边,在改变边框线的宽度后线宽依旧没有变化,考虑到是窗口的内容遮住了边框线,于是在ui文件中重写调整绘制边框线的控件上面的窗口的大小,使绘制边框线的窗口上的窗口小于绘制边框线的窗口。这样绘制的边框线便不会被遮挡。
先看一下整个ui窗口的结构:
边框线在子控件backwidget上绘制的,并设置整个窗口LayoutShowForm为栅格布局,布局的上下左右边距均为0,这样backWidget与LayoutShowForm一样大小,在backWidget之上,进行垂直布局,将控件widget与titleWidget进行垂直布局,在titleWidget之中将namelabel进行了栅格布局,从而呈现上面所示的界面。
边框线在backWidget上绘制的,由于backWidget与LayoutShowForm一样大小,所以不能显示完整的边框线。这时需重新调整backWidget的栅格布局的上下左右边距,使该边距能正好显示出所设置的线宽,这样就能显示正常的边框线。下面是调整完backWidget的上下左右边距后的ui。
ui窗口如下图:
对应的ui的结构图还是没有变化,只是backWidget的栅格布局中设置了上下左右边距。之前所有的栅格布局边距都为0.
调整后的栅格布局的上下左右边距:
接下来,上代码,由于边框线是在子控件上绘制的,而并非直接在窗口LayoutShowForm上绘制,这里不能直接使用重绘函数,而必须使用事件过滤,首先在子控件backWidget上安装事件过滤:
ui->backWidget->installEventFilter(this);
接下来重写事件过滤:
bool LayoutShowForm::eventFilter(QObject *watched, QEvent *event)
{
if (watched == ui->backWidget && event->type() == QEvent::Paint) {
paintLayoutPreBoardLine(ui->backWidget);
return true;
}
return false;
}
在事件过滤函数中实现绘制边框线:
void LayoutShowForm::paintLayoutPreBoardLine(QWidget *widget)
{
QPainter painter(widget);//backWidget
QPen pen;
pen.setWidth(3);
pen.setColor(m_colorBorad);
painter.setPen(pen);
painter.setRenderHint(QPainter::Antialiasing);
painter.drawRect(QRect(0,0,244,165));
m_isSetBoardColor = false;
qDebug()<<QStringLiteral("重绘边框色");
}
忘记一点当设置了backWidget的栅格布局的上下左右间距后,原本的垂直布局中的内容就会变小,读者可以根据项目需要来调整各控件的大小。
以上便可以实现边框线正常显示。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。