本文章基本全代碼敲窗口小球游戲,最后會免費加上源代碼,讓讀者有更清晰的了解
內容主要覆蓋:
1> Qtimer計時器的開始和結束,以及顯示系統時間等等。。。
2> 多個Qwidget布局和背景顏色調配
3>小球撞板反彈和小球撞板在Qwidget中分數的傳遞(就是小球撞一次板,分數加一,並且還要顯示出來)
注:有基礎的讀者最好先想一下困難點在哪里,並仔細看代碼中是如何實現的,本文對於QT學習是一個大的突破,畢竟全代碼,后面還有一個舒爾特方格,下次再補上來.
基本窗口就是這樣,下面直接開始介紹函數吧(0基礎摸索畫了一天時間,我自己都被自己蠢哭!)
步驟一:我弄簡單一點,做一個大的vbox垂直布局,里面包括了下面的downwidget和hbox水平布局,hbox水平布局又包括了time和upwidet(這里hbox和vbox是系統自帶函數,downwidget,time,upwidget是要自己寫的小部件,就是為了排列好看,才有了上面的布局)
hbox = new QHBoxLayout; hbox->addWidget(time); topWidget->setFixedHeight(30); time->setFixedHeight(30); hbox->addWidget(topWidget); vbox = new QVBoxLayout(); vbox->addLayout(hbox); vbox->addWidget(bottomWidget); setLayout(vbox); resize(800, 600); palette.setBrush(this->backgroundRole(), Qt::lightGray); this->setPalette(palette);
步驟二: time里面加入系統時間(關鍵),upwidget里面加入label(這里我說一下,如何實現小球撞板分數就加一呢?關鍵在於球的橫縱坐標等於擋板的橫縱坐標即相撞時,就要發出一個myscore的信號,然后mainwidget里面接到,傳給upwidget,upwidget里面的變量加1,再輸出就實現啦!)downwidget里面加入小球運動的函數就可以了
time:
QDateTime time = QDateTime::currentDateTime(); QString str = time.toString("yyyy-MM-dd hh:mm:ss dddd"); label->setText(str);
upwidget:
upscore++; labelScore->setText(QString("Score: %1 ").arg(upscore));
downwidget:
(小球運動的代碼太過簡單,所以很多,這里不寫,讀者直接看壓縮包)
步驟三:設置背景,前2步最重要吧,背景什么的就是為了好看,2個按鈕也只需要加個timer.stop()之類的就可以了
void UpWidget::paintEvent(QPaintEvent *event){ Q_UNUSED(event); QPainter p(this); p.setPen(Qt::NoPen); p.setBrush(Qt::yellow); p.drawRect(rect()); }
總結:按照老師要求,本游戲可以實現擋板檔球,每擋一次分數加一,顯示時間,讓球停止,讓球加速,整體布局的功能,主要內容就是先布局 widget,然后在每一個widget里面分別操作,互不干擾,唯一影響的就是傳分數,上面說了一遍,我再說一下,讀者可能還是很疑惑,就是downwidget是無法傳分數的,只需要發一個信號(函數)就可以了,然后mainwidget實現的是一種中轉站的功能,把upwidget和downwidget聯系起來,接收他的信號,讓變量+1,再顯示在label上面就可以了,很簡單的一個游戲,但是我這個垃圾從0開始,搞了一天才搞完,有問題再討論。
博客園上面好像傳不了壓縮包啊,沒辦法啦,傳到網盤去吧,以后留個紀念!
鏈接: https://pan.baidu.com/s/1o799EjC 密碼: ijyw