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