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