QT翻金幣遊戲的choosesence場景的配置
阿新 • • 發佈:2021-02-05
技術標籤:QT學習筆記
目錄~
設計這個介面,其實也不難。
設定標題,圖示,尺寸
首先新建類,就叫 c h o o s e s e n c e choosesence choosesence吧
上來先設定一下標題,圖示和視窗大小
this->setFixedSize(QSize(520,688));
this->setWindowIcon(QPixmap(":/res/Coin0001.png"));
this->setWindowTitle("選擇關卡" );
設定選單退出
然後設定一下選單的退出選項
按照 Q M e n u B a r − Q M e n u − Q A c t i o n QMenuBar-QMenu-QAction QMenuBar−QMenu−QAction的層級關係一個一個設定下來
最後用 c o n n e c t connect connect給退出 a c t i o n action action繫結事件,觸發時讓當前視窗關閉
//下面是設定選單
QMenuBar *Men = new QMenuBar();
this->setMenuBar(Men);
QMenu *option = Men->addMenu(QString("開始"));
QAction *exit = option->addAction(QString("退出"));
connect(exit,&QAction::triggered,[=](){
this->close();
});
設定視窗背景
然後設定一下視窗的背景
還是一樣重寫 p a i n t E v e n t paintEvent paintEvent方法
void Choosescence::paintEvent(QPaintEvent * )
{
QPainter painter(this);
QPixmap map;
map.load(":/res/OtherSceneBg.png");
painter.drawPixmap(0,0,this->width(),this->height(),map);
map.load(":/res/Title.png");
painter.drawPixmap( (this->width()-map.width())*0.5,30,map);
}
設定20個選關按鈕
最後來到了我們的核心,中間的 20 20 20個選關按鈕
但是這是不規則按鈕??沒關係,我們寫好了自己的不規則按鈕類按鈕類
那麼我們直接 f o r for for迴圈 20 20 20次,計算當前按鈕屬於第幾行第幾列
然後移動到相應的位置即可
但是按鈕中間還有一個數字表示關卡號
加入直接用按鈕的 s e t T e x t setText setText方法太醜了(因為按鈕不規則導致的)
沒關係,我們用 l a b e l label label設定數字,然後移動到相同座標就可以啦!!!
但是這樣發現點選按鈕沒反應了!!原因是 l a b e l label label直接擋住了按鈕
我們還需要設定 l a b e l label label的屬性,滑鼠穿透性
label->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);//文字的居中表示
//設定滑鼠進行穿透
label->setAttribute(Qt::WA_TransparentForMouseEvents);//滑鼠穿透
//設定4*5個按鈕
int x = 0,y = 0;
//監聽每個按鈕的點選事件
for(int i=0;i<20;i++)
{
MyPushButton *circle = new MyPushButton(":/res/LevelIcon.png");//新建按鈕
circle->setParent(this);//繫結父親
x = 70+i%4*100, y = 144+i/4*100;//計算座標
circle->move(x,y);
connect(circle,&MyPushButton::clicked,[=](){//觸發按鈕開啟遊戲
qDebug() << QString("你選擇了第%1關").arg(i+1) ;
this->hide();
play = new playScence(i+1);
play->show();
});
QLabel *label = new QLabel;
label->setParent(this);
label->setFixedSize(circle->width(),circle->height());
label->setText(QString::number(i+1) );
label->move(x,y);
label->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
//設定滑鼠進行穿透
label->setAttribute(Qt::WA_TransparentForMouseEvents);
}
這樣就大功告成啦!!!