Qt控件-QListWidget

Qt控件-QListWidgetQListWidget去掉选中虚线框虚线框如下所示,选中某项之后,文字包围一个虚线框,修改QSS,添加outline约束即可,QListView{/*border:1pxsolid#636363;*/border:0px;selection-background-color:#4D4D4D;sele…

大家好,又见面了,我是你们的朋友全栈君。

QListWidget去掉选中虚线框

虚线框如下所示,选中某项之后,文字包围一个虚线框,
这里写图片描述
修改QSS,添加outline约束即可,

QListView { 
   
        /*border: 1px solid #636363;*/
        border: 0px;
        selection-background-color: #4D4D4D;
        selection-color: #F0F0F0;
        background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, stop:0 #4D4D4D, stop:1 #292929);
        outline:0px;
}

QListWidget添加自定义窗体

继续学习博客Qt浅谈之三十五仿QQ设置面板功能,博主的界面长这样,
这里写图片描述
原文是这样设计的:上面的导航切换选项卡使用QTabWidget,左侧导航使用QListWidget,右侧的显示区域使用QScrollArea控件;主要使用垂直滚动条的valueChanged事件和QListWidget的itemClicked事件;通过调用QWidget的visibleRegion().isEmpty() 判断QScrollArea中滑动过的区域,通过垂直滚动条的setSliderPosition方法设置QScrollArea的新的区域。
在功能区,我这里称之为面板容器,原文博主选择用QScrollArea作为容器,我这里打算采用QListWidget来实现这个容器,
Console Assist QListWidget
(录屏软件超级录屏,然后用迅雷看看转换成gif格式)
先看一下自定义窗口设置,主要使用setItemWidget函数,QSS里把边框设成0px,另外hover和selected的状态需要保持一致,否则鼠标滑过的状态不一样。

    /*QListWidgetItem**/ pLwiTcpClientContainer = new QListWidgetItem();
    //pLwiTcpClientContainer->setSizeHint(QSize(400, 400));
    pLwContainer->addItem(pLwiTcpClientContainer);
    pLwContainer->setItemWidget(pLwiTcpClientContainer, pWgtTcpClientPannel);
    /*QListWidgetItem**/ pLwiTcpServerContainer = new QListWidgetItem();
    //pLwiTcpServerContainer->setSizeHint(QSize(400, 400));
    pLwContainer->addItem(pLwiTcpServerContainer);
    pLwContainer->setItemWidget(pLwiTcpServerContainer, pWgtTcpServerPannel);
    /*QListWidgetItem**/ pLwiUdpClientContainer = new QListWidgetItem();
    //pLwiUdpClientContainer->setSizeHint(QSize(400, 400));
    pLwContainer->addItem(pLwiUdpClientContainer);
    pLwContainer->setItemWidget(pLwiUdpClientContainer, pWgtUdpClientPannel);
    if (index < pLwContainer->count())
    { 
   
        pLwContainer->setCurrentRow(index);
    }
    connect(pLwContainer, SIGNAL(itemClicked(QListWidgetItem*)), this, SLOT(OnLwContainerItemClicked(QListWidgetItem*)));
    connect(pLwContainer->verticalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(OnLwContainerVsbValueChanged(int)));

让一个item独占窗口,通过mainwindows的resizeEvent实现,

void MainWindow::resizeEvent(QResizeEvent *event)
{ 
   
    int x, y;
    x = this->width() - pLwLeftPannel->width() - 10;
    y = this->height() - pWgtTitle->height();
    pLwiTcpClientContainer->setSizeHint(QSize(x, y));
    pLwiTcpServerContainer->setSizeHint(QSize(x, y));
    pLwiUdpClientContainer->setSizeHint(QSize(x, y));
    QMainWindow::resizeEvent(event);
}

左侧列表和容器联动,通过valueChanged信号实现,这里value取值是离散的,打印了才知道,所以这里的进度条拖动的效果是卡顿的,不像原文博主那样流畅。

void MainWindow::OnLwContainerVsbValueChanged(int value)
{ 
   
    Q_UNUSED(value);
    if (value < pLwLeftPannel->count())
    { 
   
        pLwLeftPannel->setCurrentRow(value);
    }
    else
    { 
   
        qDebug() << "OnLwContainerVsbValueChanged value overflow" << value;
    }
}

自定义窗体无需设置大小,通过在外部是同item的setSizeHint来实现,

QePartitionItem::QePartitionItem(QWidget *parent) : QWidget(parent)
{ 

QGridLayout* pGLyt = new QGridLayout();
QLabel* pLabName = new QLabel(tr("Name: "));
pLabNameVal = new QLabel("waiting...");
QLabel* pLabFs = new QLabel(tr("Filesystem: "));
pLabFsVal = new QLabel("waiting...");
QLabel* pLabCap = new QLabel(tr("Capacity: "));
pLabCapVal = new QLabel("waiting...");
QLabel* pLabResCap = new QLabel(tr("Resdual Capacity: "));
pLabResCapVal = new QLabel("waiting...");
pGLyt->addWidget(pLabName, 0, 0);
pGLyt->addWidget(pLabNameVal, 0, 1, 1, 1, Qt::AlignCenter);
pGLyt->addWidget(pLabFs, 1, 0);
pGLyt->addWidget(pLabFsVal, 1, 1, 1, 1, Qt::AlignCenter);
pGLyt->addWidget(pLabCap, 2, 0);
pGLyt->addWidget(pLabCapVal, 2, 1, 1, 1, Qt::AlignCenter);
pGLyt->addWidget(pLabResCap, 3, 0);
pGLyt->addWidget(pLabResCapVal, 3, 1, 1, 1, Qt::AlignCenter);
this->setLayout(pGLyt);
//this->setFixedHeight(160);
}
QePartitionItem* pi = new QePartitionItem();
QListWidgetItem* item = new QListWidgetItem();
item->setSizeHint(QSize(240, 160));
pLwPartition->addItem(item);
pLwPartition->setItemWidget(item, pi);

这样qss才可以正常渲染item,如下所示,不设置sizehint,当窗口大小超过item默认大小(30pix左右),qss仅渲染默认部分。
158

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/136387.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • CListCtrl详细使用方法

    CListCtrl详细使用方法以下未经说明,listctrl默认view风格为report相关类及处理函数MFC:CListCtrl类SDK:以“ListView_”开头的一些宏。如ListView_InsertColumnCListCtrl风格LVS_ICON:为每个item显示大图标LVS_SMALLICON:为每个item显示小图标LVS_LIST:显示一列带有小图标的i

  • Class类 和 class对象(运行时的类型信息)

    Class类 和 class对象(运行时的类型信息)什么是类?可以理解为。class文件某种意义上来说,java有两种对象:实例对象和Class对象。每个类的运行时的类型信息就是用Class对象表示的。它包含了与类有关的信息。其实我们的实例对象就通过Class对象来创建的。Java使用Class对象执行其RTTI(运行时类型识别,Run-TimeTypeIdentification),多态是基于RTTI实现的每一个类都有一个Class对…

  • JAVA中Action层, Service层 ,modle层 和 Dao层的功能区分

    JAVA中Action层, Service层 ,modle层 和 Dao层的功能区分

  • 服务熔断与服务降级详解

    服务熔断与服务降级详解为深入理解服务雪崩解决方案中服务熔断和服务降级两个方式,在这儿做一个详解服务熔断什么是服务熔断:当下游的服务因为某种原因突然变得不可用或响应过慢,上游服务为了保证自己整体服务的可用性,不再继续调用目标服务,直接返回,快速释放资源。如果目标服务情况好转则恢复调用服务熔断的原理:业内普遍采用断路器模式原理:当远程服务被调用时,断路器将监视这个调用,如调用时间太长,断路器将会介入并中断调用。此外,断路器将监视所有对远程资源的调用,如对某一个远程资源的调用失败次数足够多,那么断路器

    2022年10月20日
  • java%f什么意思_浅析Java中print、printf、println的区别「建议收藏」

    java%f什么意思_浅析Java中print、printf、println的区别「建议收藏」printf主要是继承了C语言的printf的一些特性,可以进行格式化输出print就是一般的标准输出,但是不换行println和print基本没什么差别,就是最后会换行System.out.printf(“thenumberis:d”,t);参照JAVAAPI的定义如下:’d’整数结果被格式化为十进制整数’o’整数结果被格式化为八进制整数’x’,’X’整数结果被格式化为十六…

  • pytest指定用例_文件夹排列顺序自定义

    pytest指定用例_文件夹排列顺序自定义前言测试用例在设计的时候,我们一般要求不要有先后顺序,用例是可以打乱了执行的,这样才能达到测试的效果.有些同学在写用例的时候,用例写了先后顺序,有先后顺序后,后面还会有新的问题(如:上个用例返回

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号