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());

案例

金币翻转小游戏案例

相关推荐
ShineWinsu9 小时前
对于MySQL:数据库的操作的解析
linux·数据库·c++·mysql·面试·笔试·库的操作
云小逸9 小时前
C++ 第一阶段:对象、内存与生命周期
开发语言·c++
夜航海图9 小时前
S-57 数据解剖:把一个 ENC 文件拆给你看
c++
(Charon)9 小时前
【C++】网络缓冲区设计(三):Chain Buffer链式缓冲区、动态扩容与跨节点读写
服务器·c++
软行11 小时前
LeetCode 每日一题 3876. 构造奇偶一致的数组 II
c++·算法·leetcode
繁星蓝雨11 小时前
C++设计原理———重载(extern “C“的由来、顺序依赖、语义依赖、overload、名称修饰符、对象操作、运算符重载、新增运算符、枚举和布尔类型)
c语言·c++·extern c·overload·重载·语义依赖·顺序依赖
handler0111 小时前
【Linux】虚拟地址空间解析
linux·运维·c++·线程·进程·虚拟地址空间·虚拟地址
(Charon)11 小时前
【C++】网络缓冲区设计(二):Ring Buffer环形缓冲区、head/tail与跨界读写
开发语言·c++
码匠许师傅12 小时前
【设计模式精讲】24.观察者模式(Observer)
c++·观察者模式·设计模式·uml
imgsq12 小时前
S-57 数据解剖:把一个 ENC 文件拆给你看
c++·数据可视化