qt棋盘覆盖,实现动态呈现,可以前进或者退出的代码
时间: 2023-08-12 20:06:28 浏览: 119
以下是一个基于Qt的棋盘覆盖的动态呈现代码示例。您可以通过按下“前进”和“退出”按钮来控制动态呈现的进程。在代码中,我们使用了QTimer类来定时更新棋盘的状态并在Qt的GUI界面上呈现出来。
```cpp
#include <QtWidgets>
class ChessboardWidget : public QWidget {
public:
ChessboardWidget(QWidget *parent = nullptr)
: QWidget(parent), m_timer(new QTimer(this)), m_step(0) {
m_timer->setInterval(500);
connect(m_timer, &QTimer::timeout, this, &ChessboardWidget::updateChessboard);
m_layout = new QGridLayout(this);
m_layout->setSpacing(0);
m_layout->setContentsMargins(0, 0, 0, 0);
m_layout->setSizeConstraint(QLayout::SetFixedSize);
setLayout(m_layout);
resetChessboard();
}
void resetChessboard() {
m_step = 0;
m_layout->removeItem(m_layout->itemAtPosition(0, 0));
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
m_board[i][j] = 0;
QLabel *label = new QLabel();
label->setMinimumSize(50, 50);
label->setAlignment(Qt::AlignCenter);
label->setStyleSheet("border: 1px solid black;");
m_layout->addWidget(label, i, j);
}
}
m_board[0][0] = -1;
m_board[0][3] = -1;
m_board[3][0] = -1;
m_board[3][3] = -1;
updateChessboard();
}
private:
void updateChessboard() {
if (m_step >= 16) {
m_timer->stop();
return;
}
int x = m_step % 4;
int y = m_step / 4;
if (m_board[x][y] == 0) {
m_board[x][y] = 1;
m_layout->itemAtPosition(x, y)->widget()->setStyleSheet("background-color: gray;");
}
else if (m_board[x][y] == 1) {
m_board[x][y] = 0;
m_layout->itemAtPosition(x, y)->widget()->setStyleSheet("background-color: white;");
}
++m_step;
}
private:
QGridLayout *m_layout;
QTimer *m_timer;
int m_board[4][4];
int m_step;
};
class MainWindow : public QMainWindow {
public:
MainWindow(QWidget *parent = nullptr)
: QMainWindow(parent), m_chessboardWidget(new ChessboardWidget(this)) {
setCentralWidget(m_chessboardWidget);
createActions();
createMenus();
createToolBar();
setWindowTitle(tr("Chessboard Cover"));
}
private:
void createActions() {
m_resetAction = new QAction(tr("&Reset"), this);
m_resetAction->setShortcut(QKeySequence::Reset);
connect(m_resetAction, &QAction::triggered, m_chessboardWidget, &ChessboardWidget::resetChessboard);
m_startAction = new QAction(tr("&Start"), this);
m_startAction->setShortcut(tr("Ctrl+S"));
connect(m_startAction, &QAction::triggered, m_chessboardWidget, [this]() {
m_chessboardWidget->resetChessboard();
m_chessboardWidget->m_timer->start();
});
m_stopAction = new QAction(tr("S&top"), this);
m_stopAction->setShortcut(tr("Ctrl+T"));
connect(m_stopAction, &QAction::triggered, m_chessboardWidget->m_timer, &QTimer::stop);
}
void createMenus() {
m_fileMenu = menuBar()->addMenu(tr("&File"));
m_fileMenu->addAction(m_resetAction);
m_editMenu = menuBar()->addMenu(tr("&Edit"));
m_editMenu->addAction(m_startAction);
m_editMenu->addAction(m_stopAction);
}
void createToolBar() {
m_toolBar = addToolBar(tr("Edit"));
m_toolBar->addAction(m_startAction);
m_toolBar->addAction(m_stopAction);
m_toolBar->addSeparator();
m_toolBar->addAction(m_resetAction);
}
private:
ChessboardWidget *m_chessboardWidget;
QAction *m_resetAction;
QAction *m_startAction;
QAction *m_stopAction;
QMenu *m_fileMenu;
QMenu *m_editMenu;
QToolBar *m_toolBar;
};
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
MainWindow mainWindow;
mainWindow.show();
return app.exec();
}
```
在上面的示例中,我们创建了一个名为`ChessboardWidget`的自定义QWidget,它负责绘制棋盘并在Qt的GUI界面上呈现出来。我们还创建了一个名为`MainWindow`的QMainWindow,并将`ChessboardWidget`作为其中央窗口小部件。在`MainWindow`中,我们创建了文件和编辑菜单以及工具栏,并将“重置”、“开始”和“停止”操作添加到它们中。
在`ChessboardWidget`中,我们使用`QGridLayout`来创建一个4x4的棋盘,每个框是一个标签(QLabel)。我们使用一个二维数组`m_board`来跟踪每个格子的状态。-1表示一个黑色方块,0表示一个白色方块,1表示一个被覆盖的方块。在`resetChessboard`函数中,我们将棋盘重置为初始状态(黑色方块在四个角落,所有方块均为白色)。
在`updateChessboard`函数中,我们使用`m_step`变量来跟踪当前动画的进度。每当定时器超时时,我们在棋盘上移动到下一个位置,并更改该位置的颜色。如果`m_step`大于或等于16,我们停止定时器并停止动画。
在`MainWindow`中,我们使用`createActions`、`createMenus`和`createToolBar`函数来创建文件、编辑菜单和工具栏。我们通过将`resetChessboard`函数与“重置”操作关联,将`resetChessboard`函数与`m_startAction`关联并启动定时器,将`stop`函数与`m_stopAction`关联来停止定时器。
阅读全文