Qt里切割图片资源作为单个控件元素使用

Qt里切割图片资源作为单个控件元素使用

利用象棋盘和象棋为例
在这里插入图片描述
在这里插入图片描述

如上图需要知道棋子大小以及棋盘每个点的位置
1.获取棋子大小
构造函数里设置

    m_ItemsImage = QPixmap(":/new/items.png");//棋子图片
    m_nItemWidth = m_ItemsImage.width() / COLOR_MAX;//62
    m_nItemHeight = m_ItemsImage.height() / ITEM_MAX;//62
    //其中COLOR_MAX与ITEM_MAX分别为2,7,代表棋子图片的x y值

2.获取棋盘位置大小
设置棋盘为窗口(构造函数里设置)

//读取棋盘图片
    QPixmap ChessBoard(":/new/ChessBoard.png");
    //resize(pixChessBoard.size());
    setFixedSize(ChessBoard.size());
//设置棋盘图片为窗口
    QPalette palette;
    palette.setBrush( QPalette::Window,QBrush(ChessBoard));
    setPalette(palette);

利用鼠标点击事件读取棋盘各点位置

void MainWindow::mousePressEvent(QMouseEvent *event)
{
    if(event->button()==Qt::LeftButton)
    {
        //寻找棋盘某点位置。可得左上脚第一个网格点约为:(36 45),网格大小约为:(55 55)
        qDebug()<<event->pos().x();	
        qDebug()<<event->pos().y();
        //qDebug()<<event->pos().rx();
    }
}

3.将棋盘虚构成坐标系,左上角为原点,向右为x轴正向,向下为y轴正向
按照坐标系的划分将棋子分别放在棋盘对应位置

enum ITEM_TYPE{
    ITEM_SHUAI = 0,	//帅
    ITEM_SHI,		//士
    ITEM_XIANG,		//象
    ITEM_JU,			//车
    ITEM_MA,			//马
    ITEM_PAO,		//炮
    ITEM_BING,		//兵
    ITEM_MAX,
};
enum ITEM_COLOR{
    COLOR_RED = 0,	//红方
    COLOR_BLACK,		//黑方
    COLOR_MAX,
};
class QItem
{
public:
    QItem(){}
    QItem(ITEM_TYPE t,ITEM_COLOR c,QPoint point);
    ITEM_TYPE m_type;		//棋子类型
    ITEM_COLOR m_color;	//红方黑方
    QPoint m_point;			//位置
};
//每个棋子本身的信息参数—棋子图片中的行、列值以及他应该在棋盘中的初始位置
QItem::QItem(ITEM_TYPE t, ITEM_COLOR c, QPoint point)
{
    m_type = t;
    m_color = c;
    m_point = point;
}
//头文件中对棋子容器的定义
QVector<QItem> m_items;	   //所有棋子
MainWindow::initItems()
{
    m_items.clear();
    //初始化所有黑方棋子——行、列、棋盘位置(确定棋子应该在的位置,此时还未放置)
    QItem item1(ITEM_JU,COLOR_BLACK,QPoint(0,0));
    QItem item2(ITEM_MA,COLOR_BLACK,QPoint(1,0));
    QItem item3(ITEM_XIANG,COLOR_BLACK,QPoint(2,0));
    QItem item4(ITEM_SHI,COLOR_BLACK,QPoint(3,0));
    QItem item5(ITEM_SHUAI,COLOR_BLACK,QPoint(4,0));
    QItem item6(ITEM_SHI,COLOR_BLACK,QPoint(5,0));
    QItem item7(ITEM_XIANG,COLOR_BLACK,QPoint(6,0));
    QItem item8(ITEM_MA,COLOR_BLACK,QPoint(7,0));
    QItem item9(ITEM_JU,COLOR_BLACK,QPoint(8,0));
    QItem item10(ITEM_PAO,COLOR_BLACK,QPoint(1,2));
    QItem item11(ITEM_PAO,COLOR_BLACK,QPoint(7,2));
    QItem item12(ITEM_BING,COLOR_BLACK,QPoint(0,3));
    QItem item13(ITEM_BING,COLOR_BLACK,QPoint(2,3));
    QItem item14(ITEM_BING,COLOR_BLACK,QPoint(4,3));
    QItem item15(ITEM_BING,COLOR_BLACK,QPoint(6,3));
    QItem item16(ITEM_BING,COLOR_BLACK,QPoint(8,3));
    //初始化所有红方棋子
    QItem item_1(ITEM_JU,COLOR_RED,QPoint(0,9));
    QItem item_2(ITEM_MA,COLOR_RED,QPoint(1,9));
    QItem item_3(ITEM_XIANG,COLOR_RED,QPoint(2,9));
    QItem item_4(ITEM_SHI,COLOR_RED,QPoint(3,9));
    QItem item_5(ITEM_SHUAI,COLOR_RED,QPoint(4,9));
    QItem item_6(ITEM_SHI,COLOR_RED,QPoint(5,9));
    QItem item_7(ITEM_XIANG,COLOR_RED,QPoint(6,9));
    QItem item_8(ITEM_MA,COLOR_RED,QPoint(7,9));
    QItem item_9(ITEM_JU,COLOR_RED,QPoint(8,9));
    QItem item_10(ITEM_PAO,COLOR_RED,QPoint(1,7));
    QItem item_11(ITEM_PAO,COLOR_RED,QPoint(7,7));
    QItem item_12(ITEM_BING,COLOR_RED,QPoint(0,6));
    QItem item_13(ITEM_BING,COLOR_RED,QPoint(2,6));
    QItem item_14(ITEM_BING,COLOR_RED,QPoint(4,6));
    QItem item_15(ITEM_BING,COLOR_RED,QPoint(6,6));
    QItem item_16(ITEM_BING,COLOR_RED,QPoint(8,6));
    //将QItem对象放入容器m_items
    m_items.push_back(item1);
    m_items.push_back(item2);
    m_items.push_back(item3);
    m_items.push_back(item4);
    m_items.push_back(item5);
    m_items.push_back(item6);
    m_items.push_back(item7);
    m_items.push_back(item8);
    m_items.push_back(item9);
    m_items.push_back(item10);
    m_items.push_back(item11);
    m_items.push_back(item12);
    m_items.push_back(item13);
    m_items.push_back(item14);
    m_items.push_back(item15);
    m_items.push_back(item16);

    m_items.push_back(item_1);
    m_items.push_back(item_2);
    m_items.push_back(item_3);
    m_items.push_back(item_4);
    m_items.push_back(item_5);
    m_items.push_back(item_6);
    m_items.push_back(item_7);
    m_items.push_back(item_8);
    m_items.push_back(item_9);
    m_items.push_back(item_10);
    m_items.push_back(item_11);
    m_items.push_back(item_12);
    m_items.push_back(item_13);
    m_items.push_back(item_14);
    m_items.push_back(item_15);
    m_items.push_back(item_16);

4.利用绘图事件将棋子绘制在棋盘

void MainWindow::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    for (int i = 0; i<m_items.size(); i++)//m_items.size=32
    {
       QRect formerRect(m_items[i].m_color*m_nItemWidth,m_items[i].m_type
                     *m_nItemHeight,m_nItemWidth,m_nItemHeight);//棋子大小
       QRect newRect(startX+m_items[i].m_point.x()*55,startY+m_items[i].m_point.y()*56,55,56);//棋盘中的位置
       painter.drawPixmap(newRect,m_ItemsImage,formerRect);//绘制
    }
    update();
}

结果如图所示
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值