qt自定义窗口,其绘制的窗口边框线显示不全
引言
自定義窗口,該窗口包含標題欄,默認整個窗口的邊框線為藍色,當點擊該窗口的時候,窗口的邊框線便為紅色。程序在運行的時候,窗口的邊框線只顯示了左右兩邊的線,沒有顯示上下邊的線。
示例
效果:
解決方法
針對上面窗口只顯示左右兩邊,不顯示上下兩邊,在改變邊框線的寬度后線寬依舊沒有變化,考慮到是窗口的內容遮住了邊框線,于是在ui文件中重寫調整繪制邊框線的控件上面的窗口的大小,使繪制邊框線的窗口上的窗口小于繪制邊框線的窗口。這樣繪制的邊框線便不會被遮擋。
先看一下整個ui窗口的結構:
邊框線在子控件backwidget上繪制的,并設置整個窗口LayoutShowForm為柵格布局,布局的上下左右邊距均為0,這樣backWidget與LayoutShowForm一樣大小,在backWidget之上,進行垂直布局,將控件widget與titleWidget進行垂直布局,在titleWidget之中將namelabel進行了柵格布局,從而呈現上面所示的界面。
邊框線在backWidget上繪制的,由于backWidget與LayoutShowForm一樣大小,所以不能顯示完整的邊框線。這時需重新調整backWidget的柵格布局的上下左右邊距,使該邊距能正好顯示出所設置的線寬,這樣就能顯示正常的邊框線。下面是調整完backWidget的上下左右邊距后的ui。
ui窗口如下圖:
對應的ui的結構圖還是沒有變化,只是backWidget的柵格布局中設置了上下左右邊距。之前所有的柵格布局邊距都為0.
調整后的柵格布局的上下左右邊距:
接下來,上代碼,由于邊框線是在子控件上繪制的,而并非直接在窗口LayoutShowForm上繪制,這里不能直接使用重繪函數,而必須使用事件過濾,首先在子控件backWidget上安裝事件過濾:
接下來重寫事件過濾:
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);//backWidgetQPen 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的柵格布局的上下左右間距后,原本的垂直布局中的內容就會變小,讀者可以根據項目需要來調整各控件的大小。
以上便可以實現邊框線正常顯示。
總結
以上是生活随笔為你收集整理的qt自定义窗口,其绘制的窗口边框线显示不全的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: qt中下拉列表使用函数setCurren
- 下一篇: mysql heartbeat 慢_My