#include "widget.h"
#include <QDebug>
#include <QMessageBox>
#include <QFont>
#include <QMediaPlaylist>
Widget::Widget(QWidget *parent)
: QWidget(parent),
stackedWidget(nullptr),
mainPage(nullptr),
loginRegisterPage(nullptr),
pageLogin(nullptr),
pageRegister(nullptr),
titleLabel(nullptr),
btnRegisterLogin(nullptr),
btnStartGame(nullptr),
btnSettings(nullptr),
btnLeaderboard(nullptr),
btnExit(nullptr),
gifLabel(nullptr),
movie(nullptr),
settingmusicPage(nullptr),
dbManager(nullptr),
roleSelectionPage(nullptr),
levelSelectionPage(nullptr),
selectedRoleIndex(-1)
{
setWindowTitle("哈基迷大探险");
resize(800, 700);
move(550, 50);
setWindowIcon(QIcon(":/picture/mimi1.png"));
stackedWidget = new QStackedWidget(this);
QVBoxLayout *mainContainerLayout = new QVBoxLayout(this);
mainContainerLayout->addWidget(stackedWidget);
mainContainerLayout->setContentsMargins(0, 0, 0, 0);
setLayout(mainContainerLayout);
mainPage = new QWidget();
QVBoxLayout *mainPageLayout = new QVBoxLayout(mainPage);
titleLabel = new QLabel(mainPage);
titleLabel->setAlignment(Qt::AlignCenter);
titleLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
titleLabel->setMinimumSize(800, 200);
QPixmap originalPixmap(":/picture/title.png");
if (!originalPixmap.isNull()) {
QPixmap scaledPixmap = originalPixmap.scaled(
titleLabel->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation
);
titleLabel->setPixmap(scaledPixmap);
} else {
titleLabel->setText("图片加载失败");
titleLabel->setStyleSheet("color: red");
}
mainPageLayout->addWidget(titleLabel);
mainPageLayout->addSpacing(40);
QGridLayout *gridLayout = new QGridLayout();
btnRegisterLogin = new QPushButton("注册/登录", mainPage);
btnStartGame = new QPushButton("开始游戏", mainPage);
btnSettings = new QPushButton("游戏设置", mainPage);
btnLeaderboard = new QPushButton("排行榜", mainPage);
btnExit = new QPushButton("退出游戏", mainPage);
QFont btnFont("Arial", 14);
QPushButton* btns[] = {btnRegisterLogin, btnStartGame, btnSettings, btnLeaderboard, btnExit};
for (auto btn : btns) {
btn->setFont(btnFont);
btn->setMinimumSize(200, 50);
btn->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
btn->setStyleSheet(
"QPushButton {"
" background-color: pink;"
" color: white;"
" border: 2px solid white;"
" font: bold 14px;"
" border-radius: 10px;"
"}"
"QPushButton:hover {"
" background-color: #ff88aa;"
"}"
"QPushButton:pressed {"
" background-color: white;"
" color: pink;"
"}"
);
}
gridLayout->addWidget(btnRegisterLogin, 0, 0);
gridLayout->addWidget(btnStartGame, 0, 1);
gridLayout->addWidget(btnSettings, 1, 0);
gridLayout->addWidget(btnLeaderboard, 1, 1);
gridLayout->addWidget(btnExit, 2, 0, 1, 2);
gridLayout->setSpacing(20);
gridLayout->setContentsMargins(50, 20, 50, 20);
mainPageLayout->addLayout(gridLayout);
gifLabel = new QLabel(mainPage);
gifLabel->setAlignment(Qt::AlignCenter);
movie = new QMovie(":/gif/mimi2.gif", QByteArray(), mainPage);
if (movie->isValid()) {
gifLabel->setMovie(movie);
movie->start();
gifLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
} else {
gifLabel->setText("动图加载失败");
gifLabel->setStyleSheet("color: red");
}
mainPageLayout->addWidget(gifLabel);
mainPageLayout->setContentsMargins(10, 10, 10, 10);
mainPageLayout->setSpacing(10);
mainPage->setLayout(mainPageLayout);
loginRegisterPage = new childwidget();
pageLogin = new Login();
pageRegister = new RegisterWidget();
stackedWidget->addWidget(mainPage);
stackedWidget->addWidget(loginRegisterPage);
stackedWidget->addWidget(pageLogin);
stackedWidget->addWidget(pageRegister);
dbManager = new DatabaseManager(this);
if (!dbManager->initDatabase()) {
QMessageBox::critical(this, "数据库错误", "无法初始化数据库,请检查应用权限");
}
roleSelectionPage = new RoleSelection();
stackedWidget->addWidget(roleSelectionPage);
levelSelectionPage = new LevelSelection();
stackedWidget->addWidget(levelSelectionPage);
rankingListPage = new RankingList();
stackedWidget->addWidget(rankingListPage);
settingmusicPage = new settingmusic(this);
stackedWidget->addWidget(settingmusicPage);
connect(settingmusicPage, &settingmusic::backToPrevious, this, [=]() {
stackedWidget->setCurrentWidget(mainPage);
});
connect(btnSettings, &QPushButton::clicked, this, [=]() {
stackedWidget->setCurrentWidget(settingmusicPage);
});
connect(btnLeaderboard, &QPushButton::clicked, this, [=]() {
QVector<RankingInfo> rankingData = dbManager->getRankingList(-1);
rankingListPage->setRankingData(rankingData);
stackedWidget->setCurrentWidget(rankingListPage);
qDebug() << "切换到排行榜页面";
});
connect(rankingListPage, &RankingList::backToMainPage, this, [=]() {
stackedWidget->setCurrentWidget(mainPage);
});
connect(btnRegisterLogin, &QPushButton::clicked, this, &Widget::onRegisterLoginClicked);
connect(loginRegisterPage, &childwidget::backToMainPage, this, &Widget::onBackToMainPage);
connect(loginRegisterPage, &childwidget::gotoLoginPage, this, &Widget::onGotoLogin);
connect(loginRegisterPage, &childwidget::gotoRegisterPage, this, &Widget::onGotoRegister);
connect(pageLogin, &Login::loginRequested, this, &Widget::handleLogin);
connect(pageRegister, &RegisterWidget::registerRequested, this, &Widget::handleRegister);
connect(pageLogin, &Login::backToPrevious, this, &Widget::onRegisterLoginClicked);
connect(pageRegister, &RegisterWidget::backToPrevious, this, &Widget::onRegisterLoginClicked);
connect(btnExit, &QPushButton::clicked, this, &Widget::close);
connect(btnSettings, &QPushButton::clicked, this, [=]() {
stackedWidget->setCurrentWidget(settingmusicPage);
});
connect(this, &Widget::loginSuccess, this, [=]() {
stackedWidget->setCurrentWidget(roleSelectionPage);
qDebug() << "登录成功,跳转至角色选择页";
});
connect(roleSelectionPage, &RoleSelection::backToPrevious, this, [=]() {
stackedWidget->setCurrentWidget(mainPage);
});
connect(roleSelectionPage, &RoleSelection::roleConfirmed, this, [=](int index) {
QMessageBox::information(this, "选择成功",
QString("你选择了角色:%1").arg(roleSelectionPage->getRoleInfo(index).name));
selectedRoleIndex = index;
stackedWidget->setCurrentWidget(levelSelectionPage);
});
connect(levelSelectionPage, &LevelSelection::backToRoleSelection, this, [=]() {
stackedWidget->setCurrentWidget(roleSelectionPage);
});
connect(levelSelectionPage, &LevelSelection::levelConfirmed, this, &Widget::handleLevelSelected);
connect(btnStartGame, &QPushButton::clicked, this, [=]() {
if (currentUsername.isEmpty()) {
QMessageBox::information(this, "提示", "请先登录才能开始游戏!");
stackedWidget->setCurrentWidget(pageLogin);
} else {
stackedWidget->setCurrentWidget(roleSelectionPage);
}
});
}
Widget::~Widget()
{
delete movie;
}
void Widget::onRegisterLoginClicked()
{
stackedWidget->setCurrentWidget(loginRegisterPage);
qDebug() << "切换到登录/注册选择页面";
}
void Widget::onBackToMainPage()
{
stackedWidget->setCurrentWidget(mainPage);
qDebug() << "切回主页面";
}
void Widget::onGotoLogin()
{
stackedWidget->setCurrentWidget(pageLogin);
qDebug() << "切换到登录页面";
}
void Widget::onGotoRegister()
{
stackedWidget->setCurrentWidget(pageRegister);
qDebug() << "切换到注册页面";
}
void Widget::handleLogin(const QString& username, const QString& password) {
if (dbManager->verifyUser(username, password)) {
QMessageBox::information(this, "登录成功", "欢迎回来," + username + "!");
currentUsername = username;
emit loginSuccess();
} else {
QMessageBox::warning(this, "登录失败", "用户名或密码错误");
}
}
void Widget::handleRegister(const QString &username, const QString &password, const QString &confirmPassword)
{
if (password != confirmPassword) {
QMessageBox::warning(this, "注册失败", "两次输入的密码不一致!");
return;
}
if (!dbManager->m_db.isOpen() && !dbManager->m_db.open()) {
QMessageBox::critical(this, "注册失败", "数据库连接失败,请重试!");
return;
}
if (dbManager->registerUser(username, password)) {
QMessageBox::information(this, "注册成功", "注册成功,请登录!");
stackedWidget->setCurrentWidget(pageLogin);
} else {
QMessageBox::warning(this, "注册失败", "用户名已存在或注册失败!");
}
}
void Widget::handleRoleSelected(int index)
{
selectedRoleIndex = index;
qDebug() << "选择角色索引:" << index;
stackedWidget->setCurrentWidget(levelSelectionPage);
}
void Widget::handleLevelSelected(int levelIndex) {
if (selectedRoleIndex == -1) {
QMessageBox::warning(this, "错误", "请先选择角色!");
return;
}
Player::RoleType roleType = (selectedRoleIndex == 0) ?
Player::RoleType::Mimi :
Player::RoleType::Yika;
GameWidget* gameWidget = new GameWidget(roleType, levelIndex, currentUsername, dbManager, this);
gameWidget->show();
}
具体解释一下每行代码什么意思