QT:完整的人機五子棋設計(四)簡單美化


在此之前,整個五子棋游戲的基本功能框架就已經搭建好了,但是界面還不好看,需要做一些調整。

2.4修改樣式

2.4.1文本樣式

文本的樣式可以在設計模式中直接修改font,即文本類,這里修改簡單明了。可以通過Alt+shift+R預覽窗口的文本信息。

image

2.4.2按鍵樣式

根據上一步修改按鍵字體樣式。

准備一張按鍵的背景圖片,例如上圖,我用是PNG圖片,能夠透明;把准備的圖片用PS調整亮度,依次保存成常規顯示、鼠標停留顯示、鼠標點擊顯示、按鍵禁能顯示四張背景圖片;把圖片添加到資源文件當中。

修改按鍵的樣式:

依然通過設計模式來進行修改,如下圖。

image

在打開的樣式表中,點擊添加資源,選擇Board-image,選擇添加的資源文件中的文件。然后棕紅色部分需要自己添加。

QPushButton代表樣式應用於按鍵

QPushButton:hover鼠標移動到按鍵上

QPushButton:pressed鼠標點擊按鍵

QPushButton:disabled按鍵禁能

添加樣式后,鼠標執行上述相關的操作,按鍵的背景會根據樣式中資源文件變動。通過預覽,可以看到操作的變化。

這里的樣式簡單的顯示不同背景,還可以進行其他的樣式設計,QT的樣式使用的是HTML的css的語法,要想豐富使用還需要學習css的語法。

 

image

  1 QPushButton{border-image:url(:/images/btnBG.png);padding:0px;border:none}
  2 QPushButton:hover{border-image:url(:/images/btnBG_hover.png)}
  3 QPushButton:pressed{border-image:url(:/images/btnBG_press.png)}
  4 QPushButton:focus:hover{border-image:url(:/images/btnBG_hover.png)}
  5 QPushButton:focus:pressed{border-image:url(:/images/btnBG_press.png)}
  6 QPushButton:disabled{border-image:url(:/images/btnBG_disable.png)}

2.4.3圖片顯示

為整個窗口顯示背景圖片:

在繪畫事件paintEvent中調用畫家的drawPixmap()接口進行繪制。

  1 void FiveChess::paintEvent(QPaintEvent *)
  2 {
  3     QPainter painter(this);
  4     QPixmap backGroundPic(QString(":/images/backGround5.png"));
  5     painter.drawPixmap(0,0,this->width(),this->height(),backGroundPic);
  6

由於背景顏色邊界不明顯,可以添加個邊框

    QPen pen;
    pen.setWidth(3);
    painter.setPen(pen)
    painter.drawRect(0,0,this->width()-1,this->height()-1);

為玩家添加頭像:

  1 QPixmap computerPhoto(QString(":/images/computer.png"));
  2 ui->computerLabel->setPixmap(computerPhoto);

顯示人機對戰游戲標題、游戲結束提示等方法相同。

2.4.4去掉標題欄

當窗口作為子部件的時候,標題欄是不會顯示的,此處是主窗體的標題欄隱藏方法。

隱藏方法:

setWindowFlags( Qt::FramelessWindowHint);

但是這個屬性設置后,窗口就無法移動了,要想通過鼠標移動窗口,需要自己實現。

實現方法:重寫鼠標移動和鼠標點擊事件。

globalPos();是獲得屏幕的坐標,根據點擊時的坐標與移動時的坐標差值,計算移動位置。

  1 void FiveChess::mousePressEvent(QMouseEvent *e) // 鼠標點擊事件
  2 {
  3 	lastPos = e->globalPos();
  4 }
  5 void FiveChess::mouseMoveEvent(QMouseEvent *e) // 鼠標移動事件
  6 {
  7 	int xLen = e->globalX() - lastPos.x();
  8 	int yLen = e->globalY() - lastPos.y();
  9 	lastPos = e->globalPos();
 10 	move(x()+xLen, y()+yLen); // 移動窗口
 11 }

實現兩個接口后,鼠標按住窗口非子部件位置就可以拖動窗口啦。

2.4.4窗口

美化完就是最終的窗口如下:

image


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM