QT使用学习
QApplication 抽象了QT的应用程序;
QWidgt抽象窗口;
exec()函数 进入消息循环,等待用户输入;
QPainter绘图部分:
void MyWidge::paintEvent(QPaintEvent *)
{
//绘制类,参数:绘制对象
//绘制打印机、绘制图画、拷屏
QPainter painter(this);//this代指这个类
painter.setPen(QColor(255,0,0));//设置线条的颜色,外延
painter.setBrush(QBrush(QColor(255,0,255)));//设置填涂的颜色,封闭图形
painter.drawLine(QPoint(0,0),QPoint(100,100));//在某两点之间画直线
painter.drawText(200,200,"Hello");//在某位置输入文本
painter.drawEllipse(QPoint(200,300),50,50);//在某位置画椭圆,需要输入两个方向的半径
}
鼠标事件(需要和绘图结合)
void MyWidge::paintEvent(QPaintEvent *)
{
//绘制类,参数:绘制对象
//绘制打印机、绘制图画、拷屏
QPainter painter(this);//this代指这个类
# if 0
painter.setPen(QColor(255,0,0));
painter.setBrush(QBrush(QColor(255,0,255)));
painter.drawLine(QPoint(0,0),QPoint(100,100));
painter.drawText(200,200,"Hello");
painter.drawEllipse(QPoint(200,300),50,50);
# endif
painter.drawEllipse(_ptClick,30,30);//点击的位置效果
}
void MyWidge::mousePressEvent(QMouseEvent *ev)//前置声明
{
//得到鼠标点击的地方
_ptClick = ev -> pos();
update();//强制程序重新绘制界面
}
按钮设置
MyWidge::MyWidge(QWidget *parent) : QWidget(parent)
{
_button = new QPushButton("button",this);//名字和this指针
//_button -> show();可省
}
象棋程序
ChessBY.pro
HEADERS += \
Board.h \
Stone.h \
MainWnd.h \
CtrlPanel.h \
Step.h \
ChooseDlg.h \
SingleGame.h \
MultiGame.h \
NetGame.h
SOURCES += \
Board.cpp \
main.cpp \
Stone.cpp \
MainWnd.cpp \
CtrlPanel.cpp \
Step.cpp \
ChooseDlg.cpp \
SingleGame.cpp \
MultiGame.cpp \
NetGame.cpp
QT += widgets gui network //QT图形界面
main.cpp
#include <QApplication>
#include "ChooseDlg.h"
#include "MainWnd.h"
#include <QTime>
int main(int argc, char* argv[])
{
QApplication app(argc, argv);
QTime t = QTime::currentTime();
qsrand(t.msec()+t.second()*1000);
ChooseDlg dlg; //选择框
if(dlg.exec() != QDialog::Accepted)
return 0;
MainWnd wnd(dlg._selected);//根据选择框的选择创建主窗体
wnd.show();
return app.exec();
}
(之后,函数定义在cpp文件中,类成员变量 和类成员函数声明在h文件中)
选择框部分
chooseDlg.cpp
创建四个按钮并根据选择进入哪个窗口;
#include "ChooseDlg.h"
#include <QVBoxLayout>
ChooseDlg::ChooseDlg(QWidget *parent) : QDialog(parent)
{
QVBoxLayout* lay = new QVBoxLayout(this);
lay->addWidget(_buttons[0] = new QPushButton("人机对战"));
lay->addWidget(_buttons[1] = new QPushButton("人人对战"));
lay->addWidget(_buttons[2] = new QPushButton("网络对战(服务端)"));
lay->addWidget(_buttons[3] = new QPushButton("网络对战(客户端)"));
for(int i=0; i<4; ++i)
{
connect(_buttons[i], SIGNAL(clicked()), this, SLOT(slotClicked()));
}
}
void ChooseDlg::slotClicked()
{
QObject* s = sender();
for(int i=0; i<4; ++i)
{
if(_buttons[i] == s)
{
this->_selected = i;
break;
}
}
accept();
}
ChooseDlg::~ChooseDlg()
{
}
ChooseDig.h
#ifndef ChooseDlg_H
#define ChooseDlg_H
#include <QDialog>
#include <QPushButton>
class ChooseDlg : public QDialog
{
Q_OBJECT
public:
explicit ChooseDlg(QWidget *parent = 0);
~ChooseDlg();
QPushButton* _buttons[4];
int _selected;//成员变量,决定是哪个选择
signals:
public slots:
void slotClicked();
};
#endif // ChooseDlg_H
主窗体部分
MainWind.cpp
#include "MainWnd.h"
#include <QHBoxLayout>
#include "SingleGame.h"
#include "MultiGame.h"
#include "NetGame.h"
MainWnd::MainWnd(int gameType, QWidget *parent) : QWidget(parent)
{
_gameType = gameType;
if(_gameType == 0)//人机对战
{
SingleGame* game = new SingleGame;
CtrlPanel* panel = new CtrlPanel;
QHBoxLayout* hLay = new QHBoxLayout(this);
hLay->addWidget(game, 1);
hLay->addWidget(panel);
connect(panel, SIGNAL(sigBack()), game, SLOT(slotBack()));
}
else if(_gameType == 1)//人人对战
{
MultiGame* game = new MultiGame;
CtrlPanel* panel = new CtrlPanel;
QHBoxLayout* hLay = new QHBoxLayout(this);
hLay->addWidget(game, 1);
hLay->addWidget(panel);
connect(panel, SIGNAL(sigBack()), game, SLOT(slotBack()));
}
else if(_gameType == 2)//网络对战(服务端)
{
NetGame* game = new NetGame(true);
CtrlPanel* panel = new CtrlPanel;
QHBoxLayout* hLay = new QHBoxLayout(this);
hLay->addWidget(game, 1);
hLay->addWidget(panel);
connect(panel, SIGNAL(sigBack()), game, SLOT(slotBack()));
}
else if(_gameType == 3)//网络对战(客户端)
{
NetGame* game = new NetGame(false);
CtrlPanel* panel = new CtrlPanel;
QHBoxLayout* hLay = new QHBoxLayout(this);
hLay->addWidget(game, 1);
hLay->addWidget(panel);
connect(panel, SIGNAL(sigBack()), game, SLOT(slotBack()));
}
}
MainWnd::~MainWnd()
{
}
MainWind.h
#ifndef MAINWND_H
#define MAINWND_H
#include <QWidget>
#include "Board.h"
#include "CtrlPanel.h"
class MainWnd : public QWidget
{
Q_OBJECT
public:
explicit MainWnd(int gameType, QWidget *parent = 0);//gameType就是_selected
~MainWnd();
int _gameType;
signals:
public slots:
};
#endif // MAINWND_H
棋盘(核心)
Board.cpp
#include "Board.h"
#include <QPainter>
#include <QMouseEvent>
#include <QDebug>
#define GetRowCol(__row, __col, __id) \
int __row = _s[__id]._row;\
int __col = _s[__id]._col
Board::Board(QWidget *parent) : QFrame(parent)
{
this->_r = 20; //棋子半径长度为20
setMinimumSize(_r*18+1, _r*20+1);
init(true);
}
Board::~Board()
{
}
void Board::init(bool bRedSide) //初始化棋子
{
for(int i=0; i<32; ++i)
{
_s[i].init(i); //每个都调用初始化函数
}
if(bRedSide)
{
for(int i=0; i<32; ++i)
{
_s[i].rotate();
}
}
_selectid = -1; //被选中的棋子id,默认为-1
_bRedTurn = true;
_bSide = bRedSide;
update();
}
void Board::paintEvent(QPaintEvent *)
{
int r = height()/20;
_r = r;
_off = QPoint(r+1, r+1);
QPainter p(this); //定义painter对象
p.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);
p.save();
drawPlate(p); //绘制棋盘线
p.restore();
p.save();
drawPlace(p);
p.restore();
p.save();
drawInitPosition(p);
p.restore();
p.save();
drawStone(p);//绘制棋子
p.restore();
}
void Board::drawStone(QPainter &p)
{
for(int i=0; i<32; i++)
{
drawStone(p, i);
}
}
bool Board::isDead(int id)
{
if(id == -1)return true;
return _s[id]._dead;
}
绘制棋子,参数有绘画对象(引用,因为要改变这个对象的值,不能用引用)以及棋子对应的id
void Board::drawStone(QPainter &p, int id)
{
if(isDead(id)) return;
//设置颜色
QColor color;
if(red(id)) color = Qt::red; //红棋红色
else color = Qt::black; //黑棋黑色
p.setPen(QPen(QBrush(color), 2));
//设置填充颜色
if(id == _selectid) p.setBrush(Qt::gray);//被选中则灰色
else p.setBrush(Qt::yellow); //否则是黄色
p.drawEllipse(cell(id));//圆心就是该id的行和列
//设置字体
p.setFont(QFont("system", _r*1.2, 700));//设置大小和粗度
p.drawText(cell(id), name(id), QTextOption(Qt::AlignCenter)); //name是stone里的名字函数,第三个参数对齐方式是中间对齐u
}
QString Board::