QT初尝试之熄灯游戏

首先热烈庆祝关于QT学习的开篇成功。

计划QT的学习路线如下:(不错,不错,已经到一啦,毕竟已经开始了嘛,俗话说万事开头难嘛。给自己个呵呵吧)

一、QT Creator快速入门、Qt及Qt Quick开发实战精解

二、精通Qt4编程

三、C++ GUI Qt4 编程 (第二版)

四、Qt高级编程

五、C++设计模式--基于Qt4开源跨平台开发框架

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

进入本篇正题:

游戏规则:

1、随机生成1-30个灯的亮灭状态

2、玩家按下某一个灯后,两边的灯和其本身的状态会取反

3、随机生成的状态,保证可以全部按灭

4、同时给出按灭需要的最少按下次数

5、记录玩家按下的次数

自己简单总结了一下用到的知识点:

1、新建QT Widgets Application(桌面)应用程序,继承自QMainWindow类。

2、在代码中添加UI控件

QLabel* labelChoose = new QLabel(ui->centralwidget);
QComboBox *cmboxchoose = new QComboBox(ui->centralwidget);

3、使用了QComboBox控件

QComboBox *cmboxchoose = new QComboBox(ui->centralwidget);
    for(int i=1;i<31;i++)
    {
        //添加下拉框的内容
        cmboxchoose->addItem(QString::number(i,10));
    }
    cmboxchoose->move(labelChoose->width()+5,0);//下拉框的位置
    cmboxchoose->setFont(font);//设置显示内容的字体属性
    //捕获下拉事件并返回index值
    connect(cmboxchoose,SIGNAL(currentIndexChanged(int)),this,SLOT(ChooseChanged(int)));

4、使用了QLabel

QFont font("楷体",20,75);//定义字体属性
QLabel* labelChoose = new QLabel(ui->centralwidget);
labelChoose->setText("请选择灯的数量:");//设置内容
labelChoose->setFont(font);//设置内容的字体属性
labelChoose->move(5,5);//设置位置
labelChoose->adjustSize();//根据内容自动调整控件尺寸

5、QLabel显示图片并自动缩放

//两种都可以
QPixmap pixmap("on.jpg");
//QPixmap fitpixmap = pixmap.scaled(60, 100, Qt::KeepAspectRatio, Qt::SmoothTransformation);  // 按比例缩放
labelLights[i]->resize(60,100);
labelLights[i]->setScaledContents(true);
labelLights[i]->setPixmap(pixmap);

6、事件过滤器eventFilter的使用

bool eventFilter(QObject *obj, QEvent *event);
labelimg->installEventFilter(this);//安装事件过滤器
bool MainWindow::eventFilter(QObject *watched, QEvent *event)
{
    for (int i=0;i<30;i++)
    {
        if(watched==labelLights[i])
        {
            if(event->type()==QEvent::MouseButtonPress)
            {
                QMouseEvent *mouseevent=static_cast<QMouseEvent*>(event);
                if(mouseevent->button()==Qt::LeftButton)
                {
                    m_iYourMoveNum++;
                    PressedLight(i);
                    lightsState[i]=!lightsState[i];

                    //对两边灯状态的影响
                    if(i==0&&m_ilightNum>0)
                    {
                        PressedLight(i+1);
                        lightsState[i+1]=!lightsState[i+1];
                    }
                    else if((i==(m_ilightNum-1))&&(m_ilightNum>1))
                    {
                        PressedLight(i-1);
                        lightsState[i-1]=!lightsState[i-1];
                    }
                    else
                    {
                        PressedLight(i+1);
                        PressedLight(i-1);
                        lightsState[i-1]=!lightsState[i-1];
                        lightsState[i+1]=!lightsState[i+1];
                    }

                    //判断是否全部熄灭
                    IsSuccess();
                }
            }
            return false;
        }
    }
    return MainWindow::eventFilter(watched,event);
}

 

7、QLabel的按下事件,本来也想用信号槽实现的,但是不知道为啥捕获不到

//connect(labelimg1,SIGNAL(mousePressEvent()),this,SLOT(PressedLight));//添加信号槽,为啥捕获不到呢?

写在结尾的话:

源码地址:https://download.csdn.net/download/nanfeiyannan/12257933

核心源码:https://blog.csdn.net/nanfeiyannan/article/details/104334084

有兴趣的朋友,可以继续升级成矩阵形式,而不是像我这样一条直线。

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页