用QT写不固定数量按钮,每一页4行,每一行6个,有上一页下一页翻页功能,最后一页按钮不足4列时也靠上对齐
时间: 2024-06-09 14:06:47 浏览: 122
C++ GUI Programming with Qt 4 中文版(第一章至第十章)目录版.pdf
可以使用QGridLayout布局来实现这个功能。具体实现步骤如下:
1. 创建一个QWidget,并设置其布局为QGridLayout。
2. 创建按钮,并添加到QWidget中。每一页4行,每一行6个,可以使用两个循环实现动态添加按钮。最后一页按钮不足4列时,可以将其它按钮向上对齐,可以使用QGridLayout的setAlignment方法实现。
3. 创建翻页按钮,并添加到QWidget中。可以使用QHBoxLayout布局将翻页按钮放在QWidget底部。
4. 实现翻页功能。可以使用一个变量记录当前页数,点击翻页按钮后更新变量值,并重新布局按钮。
下面是代码示例:
```cpp
#include <QtWidgets>
class ButtonWidget : public QWidget {
public:
ButtonWidget(QWidget *parent = nullptr) : QWidget(parent) {
// 创建按钮
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 6; j++) {
QPushButton *button = new QPushButton(QString("Button %1").arg(i * 6 + j + 1));
m_buttons.append(button);
}
}
QPushButton *nextButton = new QPushButton("Next");
QPushButton *prevButton = new QPushButton("Prev");
// 创建布局
QGridLayout *layout = new QGridLayout;
int row = 0, col = 0, index = 0;
for (auto button : m_buttons) {
layout->addWidget(button, row, col);
col++;
if (col == 6) {
col = 0;
row++;
}
if (row == 4) {
row = 0;
col = 0;
m_pageWidgets.append(new QWidget);
m_pageWidgets.last()->setLayout(layout);
layout = new QGridLayout;
}
index++;
}
// 处理最后一页按钮不足4列时的对齐问题
if (col != 0) {
for (int i = col; i < 6; i++) {
layout->addItem(new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Fixed), row, i);
}
}
m_pageWidgets.append(new QWidget);
m_pageWidgets.last()->setLayout(layout);
// 创建翻页按钮布局
QHBoxLayout *buttonLayout = new QHBoxLayout;
buttonLayout->addWidget(prevButton);
buttonLayout->addWidget(nextButton);
// 创建主布局
QVBoxLayout *mainLayout = new QVBoxLayout;
mainLayout->addWidget(m_pageWidgets.first());
mainLayout->addLayout(buttonLayout);
setLayout(mainLayout);
// 连接翻页按钮的信号槽
connect(nextButton, &QPushButton::clicked, this, &ButtonWidget::nextPage);
connect(prevButton, &QPushButton::clicked, this, &ButtonWidget::prevPage);
}
// 下一页
void nextPage() {
if (m_currentPage == m_pageWidgets.size() - 1) {
return;
}
m_currentPage++;
QVBoxLayout *mainLayout = static_cast<QVBoxLayout *>(layout());
mainLayout->removeWidget(m_pageWidgets[m_currentPage - 1]);
mainLayout->addWidget(m_pageWidgets[m_currentPage]);
}
// 上一页
void prevPage() {
if (m_currentPage == 0) {
return;
}
m_currentPage--;
QVBoxLayout *mainLayout = static_cast<QVBoxLayout *>(layout());
mainLayout->removeWidget(m_pageWidgets[m_currentPage + 1]);
mainLayout->addWidget(m_pageWidgets[m_currentPage]);
}
private:
QList<QPushButton *> m_buttons;
QList<QWidget *> m_pageWidgets;
int m_currentPage = 0;
};
int main(int argc, char **argv) {
QApplication app(argc, argv);
ButtonWidget widget;
widget.show();
return app.exec();
}
```
运行效果如下图所示:
![buttons](https://user-images.githubusercontent.com/43426513/122429751-f3e9de80-cfc9-11eb-9a60-2d8d1a8de5c1.gif)
阅读全文