【QT入门】 QScrollArea实际运用之导航栏设计

往期回顾:

【QT入门】 QTabWidget各种常见用法详解-CSDN博客

【QT入门】 QListWidget各种常见用法详解之列表模式-CSDN博客

【QT入门】 QListWidget各种常见用法详解之图标模式-CSDN博客

 【QT入门】 QScrollArea实际运用之导航栏设计

我们通过一个实例来讲解QScrollArea的具体方法,并通过纯手写代码实现该实例。

一、QScrollArea

1、简单介绍

QScrollArea是Qt中用于实现滚动区域的小部件类,它提供了一个可滚动的视图区域,用于显示超出可见区域的内容。通过将其他小部件放置在QScrollArea中,可以实现在需要时自动启用滚动条来查看内容。

2、主要特点和用法

滚动内容:QScrollArea可以容纳其他小部件作为其子部件,并在内容超出显示区域时启用滚动条,允许用户滚动查看内容。
自适应大小:QScrollArea可以根据其子部件的大小自动调整大小,以确保内容可以正确显示,并在需要时启用滚动条。
设置滚动条策略:可以通过设置QScrollArea的滚动条策略来指定何时显示滚动条,包括垂直滚动条、水平滚动条或两者都显示。
内边距:可以设置内边距以控制内容与滚动区域边缘之间的间距。
放大缩小:QScrollArea还支持放大和缩小内容,以便用户可以调整内容的大小以适应视图区域。

二、最终效果

 由于QScrollArea能够提供了一个可滚动的视图区域,用于显示超出可见区域的内容,我们模仿迅雷去做一个界面,左边用QListWidget实现不同tab页面,右边用QScrollArea实现可以进行滚动的效果。

三、思路

1、左边导航栏实现 

左边导航栏用的列表模式的QListWidget,这个还是很好做的,样式我们先不说,主要看逻辑。

1.1、设置边框形状
pListWidget->setFrameShape(QFrame::NoFrame);

setFrameShape()方法用于设置pListWidget的边框形状,里面的NoFrame表示无边框。

顺便看一下有哪些参数:

enum Shape {
        NoFrame  = 0, // no frame
        Box = 0x0001, // rectangular box
        Panel = 0x0002, // rectangular panel
        WinPanel = 0x0003, // rectangular panel (Windows)
        HLine = 0x0004, // horizontal line
        VLine = 0x0005, // vertical line
        StyledPanel = 0x0006 // rectangular panel depending on the GUI style
    }; 

NoFrame:值为0,表示无边框
Box:值为0x0001,表示矩形框
Panel:值为0x0002,表示矩形面板
WinPanel:值为0x0003,表示矩形面板(Windows风格)
HLine:值为0x0004,表示水平线
VLine:值为0x0005,表示垂直线
StyledPanel:值为0x0006,表示根据GUI风格而定的矩形面板
1.2、设置焦点策略
pListWidget->setFocusPolicy(Qt::NoFocus);

设置了pListWidget的焦点策略为NoFocus,即不接受焦点。这样可以避免在点击pListWidget时出现焦点框,从而让界面看起来更加美观。

没有设置这行代码以前,分别点击QListWidget和QScrollArea,会得到listwidget上不同的样式,这个记住,小细节。

1.3、设置无边框窗口
this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowMinMaxButtonsHint)

这个应该很熟悉了,要记住,FramelessWindowHint表示无边框窗口,WindowMinMaxButtonsHint表示具有最小化和最大化按钮的窗口。 

1.4、添加Item

这次在listWidget里面添加Item的时候,不再是像之前那样一个一个添加,通过一个QStringList对象和addItems方法,一次性添加到listWidget里面去。

1.5添加头文件
#include <string>
using namespace std;

设置样式的时候用到了c++里的string,那么记得,一定要添加头文件和命名空间

1.6类型转换 
pListWidget->setStyleSheet(QString::fromStdString(lw_qss));

6、将一个std::string类型的变量lw_qss转换为QString类型,并将其作为样式表应用到pListWidget上。string转QString怎么转的,要熟悉记住。

1.7最终代码
    setFixedSize(150 + 900 + 30, 700);
 this->setStyleSheet("background-color:rgb(26,26,26)");

    pListWidget = new QListWidget(this);
    pListWidget->setFixedWidth(150);
 pListWidget->setFrameShape(QFrame::NoFrame);
 //这行代码解决了listWidget和QScrollArea点击时变换的问题
 pListWidget->setFocusPolicy(Qt::NoFocus);
 this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowMinMaxButtonsHint);


    pStringList << u8"基本设置" << u8"云盘设置" << u8"下载设置" << u8"接管设置" << u8"任务管理" << u8"提醒" << u8"悬浮窗" << u8"高级设置";
    pListWidget->addItems(pStringList);

 string lw_qss = R"(
  QListWidget
  {
   /*border:1px solid gray;   边界线、宽度、颜色*/
   background:rgb(26, 26, 26);   /*表格背景色*/
   color:rgb(200, 200, 200);     /*前景色,文字颜色*/
   font-size:15px;
   border-radius:1px;
  }

  QListWidget::item
  {
   height:40px;
   padding-left:10px; /*控制文本与left左边的距离*/
  }
  
  QListWidget::item:!active
  {
   background:rgb(26, 26, 26);
   margin:5px 20px 1px 20px;   /*上右下左,控制item与ListWidget的距离*/
  }

  QListWidget::item:hover
  {
   background:rgb(56, 56, 56);
   padding-left:30px;
  }

  QListWidget::item:selected
  {
   border-radius:15px;
   background:lightblue;
  }

  /*上次选择后保留的状态,鼠标离开后显示*/
  QListWidget::item:selected:!active
  {
   background:rgb(51,51,51);
   color:#3F85FF;
  })";

 pListWidget->setStyleSheet(QString::fromStdString(lw_qss));

都看到这里了,点个赞再走呗朋友~

加油吧,预祝大家变得更强!

  • 34
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt下的QScrollArea也可以实现放大缩小功能,实现方法类似于上面提到的Python示例代码。以下是C++的示例代码: ```cpp #include <QApplication> #include <QScrollArea> #include <QWidget> #include <QVBoxLayout> #include <QSlider> #include <QPainter> #include <QTransform> #include <Qt> class MyWidget : public QWidget { public: void paintEvent(QPaintEvent *event) override { QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing); painter.drawText(rect(), Qt::AlignCenter, tr("Hello World")); } }; class MyScrollArea : public QScrollArea { public: MyScrollArea(QWidget *parent = nullptr) : QScrollArea(parent) { // 创建QWidget部件和QSlider部件 widget = new MyWidget(this); slider = new QSlider(Qt::Horizontal, this); // 将QWidget部件设置为QScrollAreawidget setWidget(widget); // 设置QSlider的范围和初始值 slider->setRange(1, 100); slider->setValue(100); // 创建垂直布局,并将QSlider添加到布局中 auto layout = new QVBoxLayout(this); layout->addWidget(slider); setLayout(layout); // 连接QSlider的valueChanged()信号到槽函数 connect(slider, &QSlider::valueChanged, this, &MyScrollArea::scaleContent); } private: MyWidget *widget; QSlider *slider; void scaleContent(int value) { // 设置QTransform缩放比例 QTransform transform; transform.scale(value / 100.0, value / 100.0); widget->setFixedSize(transform.mapRect(widget->rect()).size()); widget->setTransform(transform); } }; int main(int argc, char *argv[]) { QApplication app(argc, argv); MyScrollArea scrollArea; scrollArea.show(); return app.exec(); } ``` 在这个示例中,我们创建了一个MyWidget类来绘制需要显示的内容,并将其作为QScrollArea的子部件。然后创建了一个QSlider来控制缩放比例,并将其添加到QScrollArea的布局中。在槽函数scaleContent()中,我们使用QTransform对QWidget进行缩放操作,并设置QWidget的大小。最终实现了QScrollArea的放大缩小功能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值