Qt 自定义侧边菜单栏切换内容页面

Qt 自定义侧边菜单栏切换内容页面

  • 一、环境
  • 二、效果
  • 三、实现方案
    • 1.方案一
      • 思路:
      • 源码:
    • 2.方案二
      • 思路:
      • 源码:

做一个类似微信侧边栏切换不同页面的功能。支持初始状态

一、环境

  • 系统: Windows 10 专业版
  • Qt:Qt 5.14.1
  • 编译套件:MinGW-32

二、效果

菜单切换示例

代码免费随便用的。

三、实现方案

对于菜单点击后的互斥效果是通过样式表来设置的,通过样式表的不同状态来设置对应的显示效果,下面就给出具体的小小案例,下面给出了 homeBtn的样式和 editBtn 的样式,正常情况下是一张图片,在鼠标移入后、或者选中checked的时候是另外一张图片。

  • 这里我使用的是svg格式图片,到时候也很方便扩展这个图片样式,svg是文本格式的描述图像的规范
QPushButton
{
	border: 1px solid transparent;
	min-height:24px;
	max-height:24px;
	min-width:24px;
	max-width:24px;
}

/*HomeBtn*/
QPushButton#HomeBtn
{	
	image: url(:/images/home.svg);
}
QPushButton#HomeBtn:checked, QPushButton#HomeBtn:hover
{	
	image: url(:/images/home-filling.svg);
}
/*EditBtn*/
QPushButton#EditBtn
{	
	image: url(:/images/edit.svg);
}
QPushButton#EditBtn:checked, QPushButton#EditBtn:hover
{	
	image: url(:/images/edit-filling.svg);
}

1.方案一

思路:

  • 在菜单栏的父控件里去动态的去查找是哪一个按钮被触发点击状态,通过设置样式表的伪态来制作对应的响应效果,同时通过按钮和对应窗口的关系进行绑定即可

源码:

  • 关键代码:
//绑定
     QList<QPushButton *> childButtons = ui->MenuWidget->findChildren<QPushButton *>();

     foreach (auto item, childButtons) 
     {
         //按钮必须设置可选,我这里直接代码设置的,ui里面也可以设置
         item->setCheckable(true);
         
         connect(item, &QPushButton::clicked, [=]()
         {
             QWidget * tempWidget = ui->stackedWidget->findChild<QWidget *>(QString(item->objectName().replace("Btn", "Wg")));

             if(tempWidget != NULL)
             {
                 ui->stackedWidget->setCurrentWidget(tempWidget);

                 //设置其他按钮状态未选中-清空状态
                 foreach (auto btn, childButtons) {
                     btn->setChecked(false);
                 }

                 //设置当前按钮被选中
                 item->setChecked(true);
             }

         });
     }
  • 完整代码下载:
    https://download.csdn.net/download/qq_43680827/87689968?spm=1001.2014.3001.5501

2.方案二

思路:

  • 用 QButtonGroup 来绑定一个组,直接利用现成的按钮触发排斥功能,最后把按钮和对应窗口的关系进行绑定即可

源码:

  • 关键代码:
    //设置点击按钮互斥
    btnGroup.setExclusive(true);

    QList<QPushButton *> childButtons = ui->MenuWidget->findChildren<QPushButton *>();

    foreach (auto item, childButtons) {
        //要先设置可以checkable
        item->setCheckable(true);
        btnGroup.addButton(item);
    }

    connect(&btnGroup, QOverload<QAbstractButton *, bool>::of(&QButtonGroup::buttonToggled),
            [=](QAbstractButton *button, bool checked)
    {
        QWidget * tempWidget = ui->stackedWidget->findChild<QWidget *>(QString(button->objectName().replace("Btn", "Wg")));
        ui->stackedWidget->setCurrentWidget(tempWidget);
    });
  • 完整代码下载:
    https://download.csdn.net/download/qq_43680827/87689968?spm=1001.2014.3001.5501

你可能感兴趣的:(▼,技术之路-Qt,qt,自定义侧边菜单栏,Qt,侧边栏切换)