C++ QT学习笔记

C++ QT学习笔记

信号和槽

cpp 复制代码
// static QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, Functor functor);
connect(ui->actionQuit,&QAction::triggered,[=](){ this->close(); });

绘图

cpp 复制代码
QPainter painter(this);
QPixmap pix;
pix.load(":/res/PlayLevelSceneBg.png");
painter.drawPixmap(0,0,this->width(),this->height(),pix);

音效

cpp 复制代码
QSoundEffect *startSound=new QSoundEffect(this);
startSound->setSource(QUrl::fromLocalFile(":/res/TapButtonSound.wav"));
startSound->play();

菜单栏

cpp 复制代码
//创建菜单栏
QMenuBar *bar=menuBar();
setMenuBar(bar);
QMenu* startMenu=bar->addMenu("开始");
QAction* quitAction= startMenu->addAction("退出");

自定义信号

cpp 复制代码
#include <QMainWindow>
#include"playscene.h"

class ChooseLevelScene : public QMainWindow
{
    Q_OBJECT
public:
    explicit ChooseLevelScene(QWidget *parent = nullptr);
    void paintEvent(QPaintEvent *event);
    PlayScene* play=NULL;
signals:
    //写一个自定义信号,告诉主场景  点击了返回
    //只需要声明,不需要实现
    void chooseSceneBack();
};


connect(backBtn,&MyPushButton::clicked,[=](){
    //返回主场景
    backSound->play();
    QTimer::singleShot(500,this,[=](){
        emit this->chooseSceneBack();//发送信号
    });
});

chooseLevel=new ChooseLevelScene();
connect(chooseLevel,&ChooseLevelScene::chooseSceneBack,[=](){ //接收信号
    chooseLevel->setGeometry(this->geometry());
    chooseLevel->hide();
    this->show();
});

文字

cpp 复制代码
QLabel* levelLabel=new QLabel();
levelLabel->setParent(this);
levelLabel->setFixedSize(levelBtn->width(),levelBtn->height());
levelLabel->setText(QString::number(i+1));
levelLabel->move((i%4)*70+25,(i/4)*70+130);

//设置文字在Label中的对齐方式
levelLabel->setAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
levelLabel->setAttribute(Qt::WA_TransparentForMouseEvents);

//设置字体
QLabel* label=new QLabel();
label->setParent(this);
QFont font;
font.setFamily("华文新魏");
font.setPointSize(20);
QString level_str=QString("Level:%1").arg(this->levelIndex);
label->setFont(font);
label->setText(level_str);
label->setGeometry(30,this->height()-60,120,50);

动画

cpp 复制代码
//动画对象
QPropertyAnimation* animation=new QPropertyAnimation(this,"geometry");
//动画时间
animation->setDuration(200);
//开始位置和结束位置
if(isUp){
    animation->setStartValue(QRect(this->x(),this->y()+10,this->width(),this->height()));
    animation->setEndValue(QRect(this->x(),this->y(),this->width(),this->height()));
}
else{
    animation->setStartValue(QRect(this->x(),this->y(),this->width(),this->height()));
    animation->setEndValue(QRect(this->x(),this->y()+10,this->width(),this->height()));
}
//设置弹跳曲线
animation->setEasingCurve(QEasingCurve::OutBounce);
animation->start();

按钮

cpp 复制代码
void MyPushButton::mousePressEvent(QMouseEvent *e){
    if(this->pressImgPath!=""){
        //切换图像
        QPixmap pix;
        bool res=pix.load(this->pressImgPath);
        if(!res){
            qDebug()<<"图片加载失败";
            return;
        }
        this->setFixedSize(pix.width(),pix.height());
        this->setStyleSheet("QPushButton{border:0px;}");
        this->setIcon(pix);
        this->setIconSize(QSize(pix.width(),pix.height()));
    }
    //让父类继续进行处理,相当于先拦截让函数先实现部分功能
    return QPushButton::mousePressEvent(e);
}

// 胜利过后,不可以点击按钮,其实也就是覆盖了父类按钮点击事件
void MyCoin::mousePressEvent(QMouseEvent *e){
    if(isAnimation||this->isWin){
        return;
    }
    return QPushButton::mousePressEvent(e);
}

计时器

cpp 复制代码
timer1=new QTimer(this);

connect(timer1,&QTimer::timeout,[=](){
    QPixmap pix;
    QString str=QString(":/res/Coin000%1.png").arg(this->min_N++);
    pix.load(str);
    this->setFixedSize(pix.width(),pix.height());
    this->setStyleSheet("QPushButton{border:0px;}");
    this->setIcon(pix);
    this->setIconSize(QSize(pix.width(),pix.height()));
    if(this->min_N>this->max_N){
        this->min_N=1;
        isAnimation=false;
        timer1->stop();
    }
});
if(this->flag){
    isAnimation=true;
    timer1->start(30);
    this->flag=false;
}

窗口偏移

解决方案:

cpp 复制代码
chooseLevel->setGeometry(this->geometry());
this->setGeometry(play->geometry());

案例

金币翻转小游戏案例

相关推荐
stolentime19 小时前
CF2277E Tree Guessing题解
c++·算法·贪心算法·交互·ad-hoc
syagain_zsx20 小时前
ODB 与 MySQL:C++ 里的 ORM 实践(类即表、事务铁律与查询封装)
开发语言·数据库·c++·mysql·工具库·1024程序员节
小鱼仙官20 小时前
使用Qt封装C/C++ 动态库 用于第三方调用
c语言·c++·qt
晚风予卿云月20 小时前
【C++高并发内存池】 1.定长内存池的实现
开发语言·c++·内存管理
闻缺陷则喜何志丹21 小时前
【c++20】协程与屏障
c++·算法·c++20·携程·屏障
会编程的小孩21 小时前
C++ 内存分区、堆与栈、static、union 完整修正版文档
c++
多弗朗皮卡丘1 天前
C++的类型转换
开发语言·c++
扶尔魔ocy1 天前
【QT OpenGL】知识点编目及传送门
qt·opengl·osg
火2251 天前
# C++ 微服务即时通讯系统(三):网关设计——HTTP 请求、Session 鉴权与 WebSocket 通知上一篇
c++·http·微服务
qq_401700411 天前
Qt Modbus 源码剖析:从 QModbusClient 到工业级通信框架
开发语言·qt·系统架构