利用QStakedWidget和QListWidget实现导航栏功能

16 篇文章 0 订阅

实现的功能类似vs的项目属性栏,主要使用QStakedWidget和QListWidget两个类实现,但最会出来的效果有些类似QTabWidget(源码仓库)。
在这里插入图片描述
QListWidget的flow属性一般为TopToBottom,而在本demo中设置为LeftToRight,代码最终的效果如下:
在这里插入图片描述
讲解下代码如何。

(1)首先在MainWindow ui中拖进来一个QListWidget,然后建立三个居中的item,分别为Widget1、Widget2、Widget3,并且设置样式表为:

QListWidget::item {
    min-height: 30px;   /*设置item高度*/
    border-style: none;  /*去掉item的borber*/
    color: rgb(0, 0, 0); /*文字颜色*/
}

QListWidget::item:selected {
    background: rgb(0, 255, 0);
}

QListWidget::item:hover {  /*鼠标悬停时的效果*/
    color: rgb(0, 0, 255);
    background: rgb(255, 0, 0);
}

在这里插入图片描述
(2)在MainWindow ui中建立一个QStackedWidget,并且建立三个page,并在每个page中水平布局添加一个QVBoxLayout待用(往里面可以填充其他控件、自定义的widget);
在这里插入图片描述
(3)新建三个widget,里面分别带有不同文字的label做标识。在这个demo中,三个widget的label文字分别为Widget1、Widget2、Widget2,以和QListWidget对应。
在MainWindow中添加三个widget的头文件,建立三个widget的指针并初始化,并分别添加到QStackedWidget对应page的QVBoxLayout中。

    m_widget1=new Widget1(this);
    m_widget2=new Widget2(this);
    m_widget3=new Widget3(this);


    ui->vLayout1->addWidget(m_widget1);
    ui->vLayout2->addWidget(m_widget2);
    ui->vLayout3->addWidget(m_widget3);

(4)建立QListWidget不同item与QStackedWidget对应page之间的关联:主要借助QListWidget::itemClicked(QListWidgetItem*)信号,在对应的槽函数取出对应item索引,将该索引传入QStackedWidget的setCurrentIndex函数即可。

信号、槽建立连接:

connect(ui->listWidget,&QListWidget::itemClicked,this,&MainWindow::on_itemClicked);

槽函数:

void MainWindow::on_itemClicked(QListWidgetItem* selectedItem)
{
    int index=ui->listWidget->currentRow();
    ui->stackedWidget->setCurrentIndex(index);
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用 `QStackedWidget` 和 `QListWidget` 实现界面切换功能。 1. 首先,在 Qt Designer 中创建一个 `QStackedWidget` 和一个 `QListWidget`,将 `QListWidget` 放置在需要显示菜单的位置上,将 `QStackedWidget` 放置在需要显示页面的位置上。 2. 在 `QListWidget` 中添加菜单项,并设置相应的文本和图标。 3. 在 `QStackedWidget` 中添加页面,并设置相应的 UI 界面。 4. 编写槽函数,用于响应 `QListWidget` 中菜单项的点击事件,并切换到相应的页面。 以下是示例代码: ```python from PyQt5.QtWidgets import QApplication, QMainWindow, QListWidget, QStackedWidget, QWidget, QVBoxLayout, QLabel, QPushButton class MainWindow(QMainWindow): def __init__(self): super().__init__() # 创建 QListWidget 和 QStackedWidget self.list_widget = QListWidget() self.stack_widget = QStackedWidget() # 添加菜单项 self.list_widget.addItem("Page 1") self.list_widget.addItem("Page 2") self.list_widget.addItem("Page 3") # 添加页面 page1 = QWidget() layout1 = QVBoxLayout() label1 = QLabel("This is Page 1") button1 = QPushButton("Go to Page 2") button1.clicked.connect(lambda: self.stack_widget.setCurrentIndex(1)) layout1.addWidget(label1) layout1.addWidget(button1) page1.setLayout(layout1) self.stack_widget.addWidget(page1) page2 = QWidget() layout2 = QVBoxLayout() label2 = QLabel("This is Page 2") button2 = QPushButton("Go to Page 3") button2.clicked.connect(lambda: self.stack_widget.setCurrentIndex(2)) layout2.addWidget(label2) layout2.addWidget(button2) page2.setLayout(layout2) self.stack_widget.addWidget(page2) page3 = QWidget() layout3 = QVBoxLayout() label3 = QLabel("This is Page 3") button3 = QPushButton("Go to Page 1") button3.clicked.connect(lambda: self.stack_widget.setCurrentIndex(0)) layout3.addWidget(label3) layout3.addWidget(button3) page3.setLayout(layout3) self.stack_widget.addWidget(page3) # 设置 QMainWindow 的 centralWidget central_widget = QWidget() central_layout = QHBoxLayout() central_layout.addWidget(self.list_widget) central_layout.addWidget(self.stack_widget) central_widget.setLayout(central_layout) self.setCentralWidget(central_widget) # 连接 QListWidget 和 QStackedWidget self.list_widget.currentRowChanged.connect(self.stack_widget.setCurrentIndex) if __name__ == "__main__": app = QApplication([]) window = MainWindow() window.show() app.exec_() ``` 在上述示例代码中,我们在 QMainWindow 中添加了一个 `QListWidget` 和一个 `QStackedWidget`,并且在 `QListWidget` 中添加了三个菜单项,在 `QStackedWidget` 中添加了三个页面。我们通过 `setCurrentIndex` 方法切换页面,并且连接了 `currentRowChanged` 信号,以便在 `QListWidget` 中点击菜单项时,自动切换到相应的页面。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值