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();
}
结果如图所示