1. 程式人生 > >Qt窗體背景繪圖和圖片顯示篇

Qt窗體背景繪圖和圖片顯示篇

今天重新研究Qt窗體繪圖和圖片顯示

(1)窗體的背景上繪製線段和區域

(2)窗體背景顯示圖片以及圖片縮放

(3)無邊框窗體顯示以及無邊框窗體的移動

(4)自定義widget形狀

(1) 在窗體上執行繪製線段和區域等操作

圖1



有時候需要在窗體的背景上繪製一些直線或者對某個區域進行填充等操作,下面就詳細說明這一操作的過程

在窗體重繪製是通過void test::paintEvent(QPaintEvent *pevent)方法進行重繪的,只是這個方法僅僅重新繪製

窗體的中心區域,圖1是一個對窗體背景進行填充的一個圖片,另外test窗體上還放置了一個QLabel,內容是"i am label 1"

看了效果圖,我們在來分析這個實現過程.由於是要對窗體test的背景進行重繪,text窗體類是繼承自class test : public QMainWindow,

預設狀態下,test窗體呼叫基類QMainWindow的虛擬函式paintEvent進行重繪test窗體的中心區域,我們要改變test的中心區域,就需要

重新實現paintEvent方法,先將void paintEvent(QPaintEvent *)新增到test類的成員函式 ,

private: 
virtual void  paintEvent ( QPaintEvent * ) ;

具體程式碼如下:

void test::paintEvent(QPaintEvent *pevent)
{
	QPainter painter(this);
	QPen pen; //畫筆
		pen.setColor(QColor(255,0,0));
		QBrush brush(QColor(255,0,0)); //畫刷
		painter.setPen(pen); //新增畫筆
		painter.setBrush(brush); //新增畫刷
		painter.drawRect(0,0,this->width(),this->height()); //繪製矩形	
<span style="white-space:pre">		</span>painter.drawLine(0,0,30,30);
}

(2)窗體背景顯示圖片以及圖片縮放

下面在看怎麼把圖片顯示到窗體背景上

圖2


使用QPixmap

void test::paintEvent(QPaintEvent *pevent)
{
	QPainter painter(this);
	QPixmap *pixmap=new	QPixmap(":test/Resources/shili2.png");	//注意是/而不是\
	painter.drawPixmap(pixmap->rect(),*pixmap);	

}

使用QImage

void test::paintEvent(QPaintEvent *pevent)
{
	QPainter painter(this);
	QImage *pimage=new QImage(":test/Resources/shili2.png");
	painter.drawImage(pimage->rect(),*pimage);

}

如果需要設定窗體背景的透明程度,我們在test的建構函式中這樣處理

test::test(QWidget *parent, Qt::WFlags flags)
	: QMainWindow(parent, flags)
{
	ui.setupUi(this);
	this->setAttribute(Qt::WA_TranslucentBackground, true);//使能透明
	this->setWindowOpacity(0.5);//設定透明度
}

如果需要對QPixmap進行縮放顯示的話可以這樣

</pre><pre name="code" class="cpp">void test::paintEvent(QPaintEvent *pevent)
{
	QPainter painter(this);
	QPixmap *pixmap=new	QPixmap(":test/Resources/shili2.png");	//注意是	
	qDebug()<<"\npixmap w and h "<<pixmap->width()<<"  "<<pixmap->height()<<"\n";
	QPixmap pixmap2;
	pixmap2=pixmap->scaled(pixmap->width()/2,pixmap->height()/2,Qt::IgnoreAspectRatio);

	qDebug()<<"\npixmap w and h "<<pixmap2.width()<<"  "<<pixmap2.height()<<"\n";
	painter.drawPixmap(pixmap2.rect(),pixmap2);	

}

需要說明的是Qt中的scaled函式不是對物件本身進行縮放操作,也就是說這裡pixmap->scaled不是對pixmap本身進行操作,

呼叫scaled後,pixmap本身不會改變,scaled返回一個縮放後的pixmap,同樣QImage也有scaled方法,可以進行縮放操作

(3)無邊框窗體顯示以及無邊框窗體的移動

在說明一下怎麼讓test窗體無邊框視窗沒有標題欄,預設拖拽窗體是沒法移動視窗的,也就是不顯示最大

化最小化這欄內容,這個做法很簡單,這屬於test的窗體屬性那麼我們可以在建構函式中指定窗體的屬性,具體做法是修改ui生

成的建構函式宣告部分的預設引數,生成的是這樣:

public:
test(QWidget *parent = 0, Qt::WFlags flags = 0);

我們只需要修改成

public:
test(QWidget *parent = 0, Qt::WFlags flags =Qt::FramelessWindowHint);

修改後重新編譯執行,截圖如圖3

圖3

使用Qt::WFlags flags =Qt::FramelessWindowHint標誌,會導致這個窗體不能移動,但還可以調節大小
實現無邊框窗體的移動:
實現無邊框窗體拖拽移動需要重寫重寫 mousePressEvent() 和 mouseMoveEvent() 虛擬函式.

示例程式碼如下,沒有進行測試過

void test::mousePressEvent(QMouseEvent *event)
    {
        if(event->button() == Qt::LeftButton)
        {
            *dragPos_ = event->globalPos() - frameGeometry().topLeft();
            event->accept();
        }
    }
     
  void test::mouseMoveEvent(QMouseEvent *event)
  {
      if(event->buttons() & Qt::LeftButton)
      {
          move(event->globalPos() - *dragPos_);
          event->accept();
      }
  }
(4)自定義widget形狀

自定義widget形狀

widget類有個setMask方法,進行設定widget 顯示的邊界:void QWidget::setMask ( const QBitmap & bitmap )對QLabel的顯示邊界設定可以這樣,

對 QPixmap獲取QBitmap,可以使用QBitmap QPixmap::mask () const

 <span style="white-space:pre">	</span>QLabel topLevelLabel;
     <span style="white-space:pre">	</span>QPixmap pixmap(":/images/tux.png");
     <span style="white-space:pre">	</span>topLevelLabel.setPixmap(pixmap);
     <span style="white-space:pre">	</span>topLevelLabel.setMask(pixmap.mask());


相關推薦

Qt窗體背景繪圖圖片顯示

今天重新研究Qt窗體繪圖和圖片顯示 (1)窗體的背景上繪製線段和區域 (2)窗體背景顯示圖片以及圖片縮放 (3)無邊框窗體顯示以及無邊框窗體的移動 (4)自定義widget形狀 (1) 在窗體上執行繪製線段和區域等操作 圖1 有時候需要在窗體的背景上繪製一些直線或者對

jQuery之圖片顯示A

1、在滑鼠放在圖片上時上下震動圖片 <!doctype html> <html> <head> <meta charset="utf-8"> <title>在滑鼠放在圖片上時震動圖片</title> <script t

CSS3感應滑鼠背景閃爍圖片縮放效果

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html

java瀏覽器檔案下載圖片顯示(流形式)

瀏覽器檔案下載:如果你想在瀏覽器中實現下載功能--一些原本不預設下載的檔案,如:jpg、xml等。 圖片顯示(流形式):如果你想在瀏覽器中顯示圖片,而圖片不是一個靜態檔案(沒有url地址) 那我們應該怎麼做呢? 分析: 瀏覽器獲得檔案是通過http協議的, 所以

navigationbar 的背景顏色圖片(老外的部落格)

How about a nice navigation bar without default iPhone gradient or with a beautiful background image? Lets do it! The thing we’re going to do in both s

Qt實現窗體的無邊框、可移動、透明不規則顯示(需背景透明的圖片

用Qt可以做出很炫的介面,更多的功能還有待學習^_^! 1、建構函式中需要做的設定: [cpp] view plaincopyprint? this->setWindowOpacity(1);//設定窗體不透明 this->setWind

Qt學習筆記:QLabel同時顯示圖片文字

環境 系統:Windows10 64位 家庭中文版 Qt版本:5.6.0 msvc2013 64位 編譯器:Visual Studio 2013 專業版 前言 QLabel是Qt自帶的一個顯示用控制元件,可以用來顯示圖片和文字。其使用也非常方便:用setPixmap(cons

Qt中設定QML窗體無邊框背景透明

主要程式碼在(main()函式中)如下: //設定窗體無邊框 view.setWindowFlags(Qt::FramelessWindowHint); //設定整個窗體背景為透明 view.setAttribute(Qt::WA_TranslucentBac

Qt 中關於QWidget的背景顏色背景圖片的設定

首先設定autoFillBackground屬性為真 然後定義一個QPalette物件 設定QPalette物件的背景屬性(顏色或圖片) 最後設定QWidget物件的Palette 例項: QWidget *widget = new QWidget; widget-

圖片作為窗體背景,但是顯示不出的問題解決。java。

今天突然想美化一下窗體,卻出現了一個問題,圖片沒法顯示。調整圖片的大小什麼的無法解決。後來想了一想是不是圖片格式的問題。試了一下就出現了。 程式碼如下:  首先將圖片匯入專案中,這樣我們只要寫相對路徑,比較省事。要注意圖片的格式。將圖片轉化成.png的

QT入門-主視窗設定背景顏色背景圖片

程式碼是在前篇空間的程式碼基礎上加的,給主視窗新增背景顏色或背景圖片 直接上程式碼: int main (int argc, char **argv) { QApplication app(a

Qt creator第一個Qt5小程式:顯示背景顏色或圖片的QWidget的Hello World視窗

用“qt-opensource-linux-x64-5.3.0.run”版本,安裝步驟,該版本已經集成了QtCreator,在Tools目錄下: [email protected]:/opt/Qt5.3.0$ ls 5.3 components.xml Do

趙雅智_運用BitmapCanvas實現圖片顯示,縮小,旋轉,水印

bitmap raw 圖形 res efault ast bmp 運用 放置 上一篇已經介紹了Android種Bitmap和Canvas的使用,以下我們來寫一個詳細實例 http://blog.csdn.net/zhaoyazhi2129/article/details

微信二次分享不顯示摘要圖片的解決方法

conf eight sage 接口 所有 微信公眾平臺 取消 onf split 微信二次分享不顯示摘要和圖片的解決方法 解決不顯示摘要和圖片的問題,需要調用微信公眾號的js-sdk的api ,需要前端和後臺的配合, 後臺需要返回 appid (公眾號的appid )

python3 用requests 保存網頁以及BeautifulSoup保存圖片,並且在本地可以正常顯示文章的內容圖片

-s bs4 圖片保存 ins date xml解析 站點 mkdir post 用requests 模塊做了個簡單的爬蟲小程序,將博客的一篇文章以及圖片保存到本地,文章格式存為‘.html‘。當文章保存到本地後,圖片的連接可能是目標站點的絕對或者相對路徑,所以要是想在本地

img標簽實現背景圖一樣的顯示效果——object-fitobject-positon

ont fit cover 一個 width none ack 都是 簡單 不知大家在做前端頁面的時候,有沒有遇到類似這樣的問題:有一個不是正方形的圖片,可能是寬度大於高度的,也可能是高度大於寬度的,而你又並不想用背景圖的方式來做,要實現用img標簽來讓此圖片顯示出一個正方

使用opencv調用24*24點陣字庫8*16ASCII字庫在圖片顯示文字數字

使用 sca show alt 編碼的轉換 獲取 引用 raw 格式 課程實驗:編程讀漢字點陣字庫,把自己的名字和學號疊加到圖片的右下位置。 主要步驟分為三部分 第一部分:讀取圖片(文件讀取) 第二部分:讀取文字並從字庫中提取相應的編碼(字庫的存儲原理) 第三部分:將相

【itext學習之路】-------(第四)給pdf增加文字水印圖片水印

一般而言,許多公司在做pdf之後,都會將公司的logo或者網址以水印的方式新增到pdf檔案中。本篇文章,我們將介紹在製作pdf的時候,如何將水印加入到pdf中去。 package cn.tomtocc.pdf; import java.io.FileNotFoundE

MFC入門(三)-- MFC圖片/文字控制元件(迴圈顯示文字圖片的小程式)

慣例附上前幾個部落格的連結: MFC入門(一)簡單配置:http://blog.csdn.net/zmdsjtu/article/details/52311107 MFC入門(二)讀取輸入字元:http://blog.csdn.net/zmdsjtu/article/details/52315088 &

Java 給PDF文件設定背景顏色背景圖片

如題,這篇文章主要介紹如何在Java應用程式中給PDF文件設定背景顏色和背景圖片。 使用元件: Spire.PDF for Java 下載Spire.PDF for JAVA包並解壓縮,然後從lib資料夾下匯入Spire.Pdf.jar包到Java應用程式中。 原PDF文件如下: