QT QTableView 智障OX棋代码

刚接触QTableView的时候随手写的OX棋(九宫棋),后面没完善所以电脑只会随机下棋。。不过也包含了一些基础用法。。

代码如下:

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include<QStandardItemModel>
#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void on_tableView_clicked(const QModelIndex &index);

    void on_pushButton_clicked();
    void win(int &w);

private:
    Ui::MainWindow *ui;
    QStandardItemModel *model;
    int *w;
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QDebug>
#include<QDateTime>
#include<QMessageBox>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    this->setWindowTitle("OOXX棋");
    model = new QStandardItemModel;
    ui->tableView->setModel(model);//显示数据
    ui->tableView->setColumnWidth(1,100);//默认列宽。
    ui->tableView->verticalHeader()->setDefaultSectionSize(100);//默认行高。

    for(int i = 0; i < 3; i++)//显示3*3空白
     {
        for(int j = 0; j < 3; j++)
        {
         model->setItem(i,j,new QStandardItem(QString::fromLocal8Bit("")));
         }
     }
    ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);//不能编辑
    ui->tableView->horizontalHeader()->setVisible(false);//不显示表头
    ui->tableView->verticalHeader()->setVisible(false);//不显示序号
    ui->tableView->setSelectionMode(QAbstractItemView::NoSelection);//不可选中
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_tableView_clicked(const QModelIndex &index)
{
    int nRow  = index.row();
    int ncolumn  = index.column();
    int w=0;
    //QString str=model.data(model->index(nRow,ncolumn));
    qDebug()<<model->data(index);
    if(model->data(index)=="")//判断是否为空
    {
        model->setItem(nRow,ncolumn, new QStandardItem("×"));
        model->item(nRow,ncolumn)->setTextAlignment(Qt::AlignCenter);   //居中
        model->item(nRow,ncolumn)->setForeground(QBrush(QColor(255, 0, 0)));//颜色
        qDebug()<<nRow<<"   "<<ncolumn;

        win(w);

        int panduan=0;
        for(int i = 0; i < 3; i++)//用来判断是否格子填满
         {
            for(int j = 0; j < 3; j++)
            {
                if(model->index(i,j).data().toString()=="")
                {
                    panduan=1;//有空格则等于1
                }
             }
         }
        if(panduan==1)//未结束则继续
        {
            int a=QDateTime::currentDateTime().toString("z").toInt();
            srand(a);
            int randNum1 = (rand()%10)/4;
            int randNum2 = (rand()%10)/4;
            while(model->index(randNum1,randNum2).data().toString()!="")
            {
             randNum1 = (rand()%10)/4;
             randNum2 = (rand()%10)/4;
             }
            model->setItem(randNum1,randNum2, new QStandardItem("o"));
            w=1;
            model->item(randNum1,randNum2)->setTextAlignment(Qt::AlignCenter);

            win(w);
        }
        panduan=0;
        for(int i = 0; i < 3; i++)//用来判断是否格子填满
         {
            for(int j = 0; j < 3; j++)
            {
                if(model->index(i,j).data().toString()=="")
                {
                    panduan=1;
                }
             }
         }
        if(panduan==0) QMessageBox::warning(this, "平局", "哇,你居然和傻瓜旗鼓相当");

    }

}
void MainWindow::win(int &w)
{
    for(int i = 0; i < 3; i++)
    {
        if((model->index(i,0).data().toString()==model->index(i,1).data().toString()&&model->index(i,1).data().toString()==model->index(i,2).data().toString()&&model->index(i,0).data().toString()!=""&&model->index(i,1).data().toString()!=""&&model->index(i,2).data().toString()!="")||
                (model->index(0,i).data().toString()==model->index(1,i).data().toString()&&model->index(1,i).data().toString()==model->index(2,i).data().toString()&&model->index(0,i).data().toString()!=""&&model->index(1,i).data().toString()!=""&&model->index(2,i).data().toString()!="")||
                (model->index(0,0).data().toString()==model->index(1,1).data().toString()&&model->index(1,1).data().toString()==model->index(2,2).data().toString()&&model->index(0,0).data().toString()!=""&&model->index(1,1).data().toString()!=""&&model->index(2,2).data().toString()!="")||
                (model->index(0,2).data().toString()==model->index(1,1).data().toString()&&model->index(1,1).data().toString()==model->index(2,0).data().toString()&&model->index(0,2).data().toString()!=""&&model->index(1,1).data().toString()!=""&&model->index(2,0).data().toString()!=""))
           {
            if(w==0)
            {
                QMessageBox::warning(this, "你赢了!", "恭喜,你赢啦~~好厉害,比傻瓜还聪明~");
            }
            else
            {
                QMessageBox::warning(this, "你输了!", "这...你也能输。。");
            }
            for(int i = 0; i < 3; i++)//显示3*3空白
             {
                for(int j = 0; j < 3; j++)
                {
                 model->setItem(i,j,new QStandardItem(QString::fromLocal8Bit("")));
                 }
             }
            break;
        }
     }
}

void MainWindow::on_pushButton_clicked()
{
    for(int i = 0; i < 3; i++)//显示3*3空白
     {
        for(int j = 0; j < 3; j++)
        {
         model->setItem(i,j,new QStandardItem(QString::fromLocal8Bit("")));
         }
     }
}

main.cpp

#include "mainwindow.h"
#include <QApplication>

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

    return a.exec();
}


效果:

QT QTableView 智障OX棋代码