Qt QListwidget与QStackedWidget或QTabWidget实现多界面切换的效果

效果图

在这里插入图片描述

使用QStackedWidget实现

  • QStackedWidget提供了一种堆栈式的界面布局方式
  • 功能:QStackedWidget允许开发者在一个固定区域内显示多个子窗口或页面,但同时只显示其中一个子窗口,其他子窗口则被隐藏。这种特性使QStackedWidget非常适合用于创建多页的界面,如向导、选项卡或其他多视图应用程序。
  1. 页面管理:你可以通过addWidget()方法向QStackedWidget添加新的页面,通过insertWidget()插入到特定的位置,或者通过removeWidget()移除页面。
  2. 当前页面:使用setCurrentIndex()方法可以根据页面的索引来切换当前显示的页面。也可以使用setCurrentWidget()通过页面控件本身来切换。
  3. 页面切换信号:当当前页面发生变化时,QStackedWidget会发出currentChanged信号,你可以连接到这个信号来执行一些自定义操作,比如更新界面或者保存数据。
  4. 布局:每个页面可以有自己的布局和控件,你可以像管理普通的QWidget一样管理每个页面。
  • 这里提供一个简单的demo
class MyWidget : public QWidget
{
    Q_OBJECT
public:
    MyWidget(QWidget *parent = nullptr) : QWidget(parent)
    {
        // 水平布局
        QHBoxLayout *layout = new QHBoxLayout(this);

        // 列表部件
        QListWidget *listWidget = new QListWidget(this);

        // 堆叠部件
        QStackedWidget *stackedWidget = new QStackedWidget(this);

        // 添加页面到列表和堆叠部件
        for (int i = 0; i < 5; ++i) {
            QString label = QString("第 %1页").arg(i + 1);

            // 添加项到列表部件
            listWidget->addItem(label);

            // 创建对应页面
            QWidget *pageWidget = new QWidget();
            QVBoxLayout *pageLayout = new QVBoxLayout(pageWidget);
            QLabel *pageLabel = new QLabel(label, pageWidget);
            pageLayout->addWidget(pageLabel);
            pageWidget->setLayout(pageLayout);

            // 添加页面到堆叠部件
            stackedWidget->addWidget(pageWidget);
        }

        // 创建按钮部件
        QPushButton *previousButton = new QPushButton("上一页", this);
        QPushButton *nextButton = new QPushButton("下一页", this);

        // 连接按钮信号到对应槽
        connect(previousButton, &QPushButton::clicked, [=](){
            int currentIndex = stackedWidget->currentIndex();
            if (currentIndex > 0) {
                stackedWidget->setCurrentIndex(currentIndex - 1);
                listWidget->setCurrentRow(currentIndex - 1);
            }
        });
        connect(nextButton, &QPushButton::clicked, [=](){
            int currentIndex = stackedWidget->currentIndex();
            if (currentIndex < stackedWidget->count() - 1) {
                stackedWidget->setCurrentIndex(currentIndex + 1);
                listWidget->setCurrentRow(currentIndex + 1);
            }
        });

        // 将列表部件和堆叠部件添加到水平布局中
        layout->addWidget(listWidget);
        layout->addWidget(stackedWidget);

        // 在水平布局下添加按钮
        QVBoxLayout *buttonLayout = new QVBoxLayout();
        buttonLayout->addWidget(previousButton);
        buttonLayout->addWidget(nextButton);
        layout->addLayout(buttonLayout);

        // 连接选项改变信号到堆叠部件的 setCurrentIndex 槽
        connect(listWidget, &QListWidget::currentRowChanged, stackedWidget, &QStackedWidget::setCurrentIndex);
        
        // 设置水平布局
        this->setLayout(layout);
    }
};

使用QTabWidget实现

  • QTabWidget 是 Qt 框架中的一种容器小部件,它用于创建一个多标签的界面,允许用户通过点击不同的标签来切换不同的子窗口或页面。在 QTabWidget 中,每个标签都对应一个页面,可以包含其他的小部件,如按钮、文本框、列表等。
    QWidget *centerWidget = new QWidget();
    QTabWidget *tabWidget = new QTabWidget(centerWidget);
    // 创建页面
    QWidget *page1 = new QWidget();
    QWidget *page2 = new QWidget();
    // 为每个页面添加一些内容
    QLabel *label1 = new QLabel("1", page1);
    QLabel *label2 = new QLabel("2", page2);
    // 将页面添加到QTabWidget
    tabWidget->addTab(page1, "1");
    tabWidget->addTab(page2, "2");
    QHBoxLayout *layout = new QHBoxLayout();
    layout->addWidget(tabWidget);
    centerWidget->setLayout(layout);
    mainWidget->setCentralWidget(centerWidget);

总结

  • 知识理应共享
  • 示例很简单,具体的页面想要什么功能需要自己补充,源码在此。
  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
动态生成 QTabWidget 可以通过在代码中使用 `QTabWidget::addTab()` 或 `QTabWidget::insertTab()` 方法来创建新的选项卡。而使用 QListWidget 和 QStackedWidget 来替代 QTabWidget 可以达到同样的效果,具体实现如下: 1. 首先,在 Qt Creator 中创建一个新的窗口应用程序项目。 2. 在主窗口中添加一个 QListWidget 和一个 QStackedWidget。 3. 在 QListWidget 中添加要显示的选项卡的名称。 4. 在 QStackedWidget 中添加要显示的选项卡的内容。 5. 在 QListWidget 的 `itemClicked()` 信号中,获取当前选中的项的索引,然后使用 `QStackedWidget::setCurrentIndex()` 方法将对应的选项卡内容显示出来。 以下是一个示例代码: ```cpp MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { ui.setupUi(this); // 添加选项卡 ui.listWidget->addItem("Tab 1"); ui.listWidget->addItem("Tab 2"); ui.listWidget->addItem("Tab 3"); // 添加选项卡内容 QWidget* widget1 = new QWidget(); QLabel* label1 = new QLabel("Tab 1 Content", widget1); QVBoxLayout* layout1 = new QVBoxLayout(widget1); layout1->addWidget(label1); ui.stackedWidget->addWidget(widget1); QWidget* widget2 = new QWidget(); QLabel* label2 = new QLabel("Tab 2 Content", widget2); QVBoxLayout* layout2 = new QVBoxLayout(widget2); layout2->addWidget(label2); ui.stackedWidget->addWidget(widget2); QWidget* widget3 = new QWidget(); QLabel* label3 = new QLabel("Tab 3 Content", widget3); QVBoxLayout* layout3 = new QVBoxLayout(widget3); layout3->addWidget(label3); ui.stackedWidget->addWidget(widget3); // 初始显示第一个选项卡内容 ui.stackedWidget->setCurrentIndex(0); // 连接 QListWidget 的 itemClicked() 信号 connect(ui.listWidget, &QListWidget::itemClicked, this, [=](QListWidgetItem* item){ int index = ui.listWidget->row(item); ui.stackedWidget->setCurrentIndex(index); }); } ``` 在上面的示例代码中,我们首先在 `MainWindow` 类的构造函数中添加了三个选项卡,然后分别创建了三个 QWidget 对象作为选项卡的内容,并将它们添加到 QStackedWidget 中。然后使用 `QStackedWidget::setCurrentIndex()` 方法将初始显示的选项卡内容设置为第一个。最后,我们连接了 QListWidget 的 `itemClicked()` 信号,当用户点击一个选项卡时,获取对应的索引并使用 `QStackedWidget::setCurrentIndex()` 方法将对应的选项卡内容显示出来。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值