QT:棋盘类设计(七)

逻辑思路

1、设置棋盘背景,定义一个QPainter,设置QPixmap属性,调用QPainter类的drawPixmap()函数
2、设置棋盘线条,设置格子宽高,起始X,Y,此处可以用qDebug()查看起始位置是否根据窗体大小变化
3、初始化棋盘数据,设置二维数组,在初始化函数中判断数据名是black还是white,根据逻辑判断设置QPixmap界面背景属性,调用QPainter类的drawPixmap()函数,将棋子画在相应格子中。(此处用二维数组对棋盘中的每个格子进行对应)根据二维数组数据赋值(white or black)进行相应位置棋子设置。
检验:直接对二维数组最后一个格子赋值black,即chessDate[7] [7] =black,查看是否能对应上。
4、点击棋盘,棋子落下显示

void Widget::mousePressEvent(QMouseEvent *event)
{
    int x = event->x();
    int y = event->y();
    if(x>startX&&x<startX+8*gridWidth){
        if(y>startX&&y<startY+8*gridHeight){
            int i,j;
            i = (x-startX)/gridWidth;
            j = (y-startY)/gridHeight;
            chessDate[i][j] = Black;
            this->update();
        }
    }
}

5、创建带ui的主界面文件,将棋盘类引入主界面文件,并用gridlayout调用棋盘类显示,此处需要对main函数棋盘类的显示替换成主界面的显示。

注:函数可分为function、event、slot,其中每项可分为private、public
在这里插入图片描述

代码结构

在这里插入图片描述
此代码没有ui文件,只需创建文件时取消ui文件勾选

cpp文件
#include "widget.h"
#include <QRect>
#include <QPixmap>
#include <QDebug>
#include <QPen>
#define GRIDCOUNT 10
Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    Init();
}

Widget::~Widget()
{

}
//---------function------------//
//(private)
void Widget::Init()
{

    bgFilename.clear();
    bgFilename = "../mychess_5/chessBack.jpg";
    lineColor = Qt::red;
    lineStyle = Qt::SolidLine;
    lineWidth = 3;
    //初始化棋盘数据
    //memset(chessDate,0,sizeof(int)*64);

}
//(public)
void Widget::changeBgFilename(const QString filename)
{
    this->bgFilename = filename;
}

void Widget::changeLine(const QColor color, const Qt::PenStyle style, const int width)
{
    this->lineColor = color;
    this->lineStyle = style;
    this->lineWidth = width;
}


//----------------slots------------------//


//----------------event------------------//
void Widget::paintEvent(QPaintEvent *)
{
    QPainter mypainter(this);
      //用图画
    QRect myrect;
    myrect.setTopLeft(QPoint(0,0));
    myrect.setBottomRight(QPoint(this->width(),this->height()));
    mypainter.drawPixmap(myrect,QPixmap("../mychess_5/image/widget_background.jpg"));

    QPen pen1;
    pen1.setColor(lineColor);
    pen1.setStyle(lineStyle);
    pen1.setWidth(lineWidth);
    mypainter.setPen(pen1);
    for(int i = 0;i<9;i++){
        mypainter.drawLine(startX,startY+i*gridHeight,9*gridWidth,startY+i*gridHeight);
        mypainter.drawLine(startX+i*gridWidth,startY,startX+i*gridWidth,9*gridHeight);
    }

    for(int i = 0;i<8;i++){
        for(int j=0;j<8;j++){
            if(chessDate[i][j] == White)
                chessFilename = "../mychess_5/image/white.png";
            else if(chessDate[i][j] == Black){
                chessFilename = "../mychess_5/image/black.png";

            }
            else{
            chessFilename.clear();
            continue;
            }
            mypainter.drawPixmap(startX+i*gridWidth,startY+j*gridHeight,gridWidth,gridHeight,QPixmap(chessFilename));
        }
    }
}
void Widget::resizeEvent(QResizeEvent *event)
{
    gridWidth = event->size().width()/GRIDCOUNT;
    gridHeight = event->size().height()/GRIDCOUNT;
    startX = gridWidth;
    startY = gridHeight;
}
void Widget::mousePressEvent(QMouseEvent *event)
{
    int x = event->x();
    int y = event->y();
    if(x>startX&&x<startX+8*gridWidth){
        if(y>startX&&y<startY+8*gridHeight){
            int i,j;
            i = (x-startX)/gridWidth;
            j = (y-startY)/gridHeight;
            chessDate[i][j] = Black;
            this->update();
        }
    }
}
h文件
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QPainter>
#include <QPaintEvent>

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = 0);
    ~Widget();
    void changeBgFilename(const QString filename);
    void changeLine(const QColor color,const Qt::PenStyle style,const int width);
    enum chessType{Empty=0,White,Black};
protected:
    void paintEvent(QPaintEvent *);
    void resizeEvent(QResizeEvent *event);
private:
    //-----------函数------------//
    void Init();

    //-----------变量------------//
    QString bgFilename;

    QColor lineColor;
    Qt::PenStyle lineStyle;
    int lineWidth;
    int gridWidth;
    int gridHeight;
    int startX;
    int startY;
    int chessDate[8][8];
    QString chessFilename;
};
#endif // WIDGET_H

main文件
#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();

    return a.exec();
}

出现问题:
1、代码调试时出现背景界面不能设置,代码继续往后写就可以了
2、界面设计时,布局完单行单列需要进行整体布局才可以随窗体变动
在这里插入图片描述

Qt技术是一套强大的跨平台应用程序开发框架,专注于使用C++语言来构建高性能、高可维护性的软件解决方案。自1991年首次推出以来,Qt因其卓越的跨平台能力、丰富的功能集、高效的开发工具和良好的社区支持而广受开发者欢迎。以下是对Qt技术的详细介绍: 核心特性 跨平台性: Qt设计的核心理念是“一次编写,到处运行”。它支持多种操作系统,包括但不限于Windows、macOS、Linux、Android和iOS。通过Qt,开发者可以使用同一套源代码,在不同平台上编译并生成原生外观与体验的应用程序,极大地提高了开发效率和产品一致性。 图形用户界面(GUI)开发: 提供了一个完整的GUI工具箱,包含各种控件(如按钮、文本框、滑块、列表视图等)、布局管理器、样式表支持、动画效果等,帮助开发者快速构建美观、功能丰富的桌面和移动应用界面。Qt Designer是一个可视化界面设计工具,允许通过拖放操作构建UI,所见即所得。 非GUI应用开发: 除了GUI程序,Qt同样适用于开发命令行工具、后台服务、嵌入式系统等非图形化应用。其底层API涵盖了文件处理、线程、网络通信、数据库访问等广泛的功能。 面向对象设计Qt采用面向对象的设计原则,提供了高度模块化的库,使得代码组织清晰、易于扩展和重用。它遵循MVC(模型-视图-控制器)模式,支持数据驱动的界面设计。 元对象系统与信号槽机制: Qt Meta-Object System(元对象系统)是Qt框架的一个重要特性,它引入了元对象编译器(moc),用于在编译时生成额外的代码以支持对象间通信、反射、动态属性绑定等高级功能。 Signal & Slot机制是Qt实现对象间事件驱动通信的核心方式。信号代表对象状态变化或事件发生,槽则是响应这些信号的可调用实体。这种松耦合的通信方式简化了异步编程和事件处理。 QML与Qt Quick: QML是一种声明性语言,结合JavaScript,用于快速创建流畅、动态的用户界面。它与Qt Quick框架紧密集成,特别适合开发现代化、触屏友好的应用。 Qt Quick Controls和Qt Quick Dialogs提供了一系列预定义的QML组件,用于构建具有传统桌面风格或现代移动风格的界面元素。同时,Qt Quick也支持自定义控件开发。 多媒体支持: Qt Multimedia模块提供对音频、视频播放、录音、摄像头访问等功能的支持,使得开发多媒体应用程序变得简便。 网络功能: Qt Network模块封装了网络通信相关的API,包括HTTP、FTP、TCP/UDP套接字、SSL加密、DNS查询等,便于开发网络应用和服务。 国际化与本地化: Qt Linguist工具支持应用程序的多语言翻译和本地化工作,确保软件能适应全球市场。 开发工具与生态系统: Qt Creator是一款集成开发环境(IDE),集成了项目管理、代码编辑、调试、版本控制、QML预览等多种功能,为Qt开发提供了无缝的工作流程。 Qt拥有活跃的开发者社区、丰富的文档资源、示例代码库以及商业支持选项,为开发者的学习、问题解决和项目实施提供了坚实后盾。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值