c++ Qt5学习笔记 2021-2-22 (setContentsMargins()作用,设计布局实现的QQ消息列表,自定义控件来实现动态添加,使用数组来控制自定义控件)
1、setContentsMargins()作用:
设置布局的边距,设置布局后,如果发现两个布局之间间距太大,可以使用setContentsMargins
拉近两个布局间的距离。
setContentsMargins
的四个参数分别为:左、上、右、下的边距。
使用时:
hLayout->setContentsMargins(0,20,0,0); //左边距20,相当于该布局向右移动20px
2、QQ的消息列表:
其实可以使用坐标来一个一个往下搭,用坐标来搭似乎还好理解一点。想了想还是使用布局来做,坐标用多了代码就看不懂了。
大致划分如下:
最外面一个水平布局1
,水平布局1
中一个头像和一个垂直布局
,垂直布局
中是水平布局2
和水平布局3
,水平布局2
中两个label
,水平布局3
中一个label
(为了方便与上面对齐,所以单独给他一个布局)。
实现的代码如下:
//水平布局1//此处的message_box为stacked widget分页中的一页QWidget *hlayout_widget = new QWidget(ui->message_box);QHBoxLayout *hLayout = new QHBoxLayout(hlayout_widget);//竖直布局QWidget *vlayout_widget = new QWidget(hlayout_widget);QVBoxLayout *vLayout = new QVBoxLayout(vlayout_widget);//水平布局2QWidget *hlayout_widget_2 = new QWidget(vlayout_widget);QHBoxLayout *hLayout_2 = new QHBoxLayout(hlayout_widget_2);//水平布局2//水平布局3QWidget *hlayout_widget_3 = new QWidget(vlayout_widget);QHBoxLayout *hLayout_3 = new QHBoxLayout(hlayout_widget_3);//水平布局3//页面上的控件//使用qlabel作为头像时,发现setStyleSheet失效,所以改为用QPushButtonQPushButton *Icon = new QPushButton(hlayout_widget);Icon->setStyleSheet("width:40px;height:40px;background-color:black;border:0px;border-radius:20px;border-image:url(:/new/prefix1/source/2.png);");QLabel *qq_name = new QLabel(u8"八度空间的秘密");QLabel *last_msg = new QLabel(u8"我肚子好饿:啊啊啊啊");QLabel *msg_date = new QLabel("2021-2-16");//向布局中添加控件hLayout->addWidget(Icon);hLayout->addWidget(vlayout_widget);vLayout->addWidget(hlayout_widget_2);hLayout_2->addWidget(qq_name);hLayout_2->addStretch(2);hLayout_2->addWidget(msg_date);vLayout->addWidget(hlayout_widget_3);hLayout_3->addWidget(last_msg);hLayout_2->setContentsMargins(0,20,0,0);hLayout_3->setContentsMargins(0,0,0,20);hlayout_widget->resize(290,110);
运行结果:
3、用来动态显示的自定义控件:
动态创建多个这样的消息,不可能一行一行写,所以通过自己声明控件的方式创建,之前用过,这里记录一下。
(1)布局来做:
在mainwindow.h
中创建public
对象:
QWidget* message_boxs(const QString &name,const QString &icon,const QString &message,const QString &msg_date) {//水平布局1QWidget *hlayout_widget = new QWidget(this);QHBoxLayout *hLayout = new QHBoxLayout(hlayout_widget);//竖直布局QWidget *vlayout_widget = new QWidget(hlayout_widget);QVBoxLayout *vLayout = new QVBoxLayout(vlayout_widget);//水平布局2QWidget *hlayout_widget_2 = new QWidget(vlayout_widget);QHBoxLayout *hLayout_2 = new QHBoxLayout(hlayout_widget_2);//水平布局2//水平布局3QWidget *hlayout_widget_3 = new QWidget(vlayout_widget);QHBoxLayout *hLayout_3 = new QHBoxLayout(hlayout_widget_3);//水平布局3QPushButton *qqicon = new QPushButton(this); //头像QLabel *qqname = new QLabel(this); //名字QLabel *qqmessage = new QLabel(this);QLabel *msg_date_label = new QLabel(this);//头像,qq名,qq信息,最后信息时间qqicon->setStyleSheet(QString("width:40px;height:40px;border:0px;border-radius:20px;border-image:url(:/new/prefix1/source/%1);").arg(icon));qqname->setText(name);qqmessage->setText(message);msg_date_label->setText(msg_date);hLayout->addWidget(qqicon);hLayout->addWidget(vlayout_widget);vLayout->addWidget(hlayout_widget_2);vLayout->addWidget(hlayout_widget_3);hLayout_2->addWidget(qqname);hLayout_2->addStretch(2);hLayout_2->addWidget(qqmessage);hLayout_3->addWidget(msg_date_label);hLayout_2->setContentsMargins(0,20,0,0);hLayout_3->setContentsMargins(0,0,0,20);hlayout_widget->resize(290,125);return hlayout_widget;}
在mainwindow.cpp
中添加:
//此处的message_box为stacked widget分页中的一页QWidget *vlayout_main_widget = new QWidget(ui->message_box);QVBoxLayout *vLayout_main = new QVBoxLayout(vlayout_main_widget);//这里可以使用数据库中查询到的数据批量添加QWidget *message_box1 = message_boxs(u8"懒羊羊","2.png",u8"我肚子好饿:啊啊啊啊","20:21");QWidget *message_box2 = message_boxs(u8"慢羊羊","3.png",u8"我肚子好饿:啊啊啊啊","20:21");QWidget *message_box3 = message_boxs(u8"喜羊羊","2.png",u8"我肚子好饿:啊啊啊啊","20:21");vLayout_main->addWidget(message_box1);vLayout_main->addWidget(message_box2);vLayout_main->addWidget(message_box3);
运行结果:
基本就有个雏形了,还要调节一下上下间距,再加个滚动条。图简单的话,接下来可以不使用布局来做了,可以把自己自建的控件是用坐标一个一个往下排就行了。
(2)坐标来做:
在mainwindow.h
中创建public
对象:
QWidget* message_boxs(const QString &name,const QString &icon,const QString &message,const QString &msg_date) {QWidget *qwidget = new QWidget(this);QPushButton *qqicon = new QPushButton(qwidget); //头像QLabel *qqname = new QLabel(qwidget); //名字QLabel *qqmessage = new QLabel(qwidget);QLabel *msg_date_label = new QLabel(qwidget);//头像,qq名,qq信息,最后信息时间qqicon->setStyleSheet(QString("width:40px;height:40px;border:0px;border-radius:20px;border-image:url(:/new/prefix1/source/%1);").arg(icon));qqname->setText(name);qqmessage->setText(message);qqmessage->setStyleSheet("color:rgb(173,173,173)");msg_date_label->setText(msg_date);qqicon->move(15,10);qqname->move(65,15);qqmessage->move(65,35);msg_date_label->move(240,15);qwidget->resize(290,60);return qwidget;}
在mianwindow.cpp
中放置控件:
QWidget *message_box1 = message_boxs(u8"懒羊羊","2.png",u8"我肚子好饿:啊啊啊啊","20:21");QWidget *message_box2 = message_boxs(u8"慢羊羊","3.png",u8"我肚子好饿:啊啊啊啊","20:21");QWidget *message_box3 = message_boxs(u8"喜羊羊","2.png",u8"我肚子好饿:啊啊啊啊","20:21");message_box1->setParent(ui->message_box);message_box1->move(0,0);message_box1->setStyleSheet("background-color:rgb(127,127,127)"); //为了定制高度,所以用颜色标识出来,可不用message_box2->setParent(ui->message_box);message_box2->move(0,60);message_box3->setParent(ui->message_box);message_box3->move(0,120);
运行结果:
之前尝试过自建设计师界面类,画一个界面,然后作为控件来放置。虽然能放,但是不会随着一起放缩和移动,所以放弃了。
(3)使用容器数组来控制:
这里紧接着上面坐标实现的操作。
在mainwindow.h
中创建public
对象:
QList<QWidget *> qWidget_group;
在mainwindow.cpp
中创建自建控件:
QStringList namelist,iconlist,meslist,timelist;//使用时,以下内容就可以替换为数据库中的信息。//像QQ中那样则应该还需要把信息传递给服务器,信息等存储在本地,//朋友的头像和其他信息等需要在服务器下载namelist.append(u8"喜羊羊");namelist.append(u8"懒羊羊");namelist.append(u8"慢羊羊");namelist.append(u8"泰哥");iconlist.append("1.jpg");iconlist.append("4.jpg");iconlist.append("5.jpg");iconlist.append("15.jpg");meslist.append(u8"哈哈哈哈");meslist.append(u8"我肚子好饿");meslist.append(u8"发生肾莫事了");meslist.append(u8"我一拳头下去就把他鼻子打骨折了");timelist.append("20:21");timelist.append("20:21");timelist.append("20:21");timelist.append("20:21");for(int i=0;i<4;i++)qWidget_group.push_back(message_boxs(namelist.at(i),iconlist.at(i),meslist.at(i),timelist.at(i))),qWidget_group[i]->setParent(ui->message_box),//鼠标悬浮效果qWidget_group[i]->setStyleSheet("QWidget::hover{background-color:rgb(235,235,235)}"),qWidget_group[i]->move(0,60*i);
运行结果:
c++ Qt5学习笔记 2021-2-22 (setContentsMargins()作用,设计布局实现的QQ消息列表,自定义控件来实现动态添加,使用数组来控制自定义控件)相关推荐
- Qt5学习笔记之零碎问题记录
目录 概述 1.qDebug输出问题 1.1 qDebug() << "OK"报错 1.2 qDebug打印QString类型 2.QString字符串的操作 3.修改 ...
- Qt5学习笔记之串口助手四:增加16进制/ASCII切换、周期发送
目录 1. 概述 2. 16进制/ASCII发送 2.1 功能实现 2.2 界面修改 3. 接收框显示发送内容 3.1 以16进制/ASCII显示 3.1.1 界面修改 3.1.2 功能实现 3.2 ...
- Qt5学习笔记之QString的使用
目录 概述 2.QString字符串的操作 2.1 拼接 2.2 裁剪 2.3 转换为int型 2.4 int转换为QString 2.5 小写字母大写字母转换 2.6 转换为16进制 概述 学习过程 ...
- Qt5学习笔记之串口助手三:打包成Windows软件
这里写目录标题 添加图标 打包程序 测试打包好的软件 添加图标 图标的获取可以参考我的另一篇文章:Qt5学习笔记之图标下载和转换,这里只记录下Qt中使用图标的方法. 1.切换到release模式下进行 ...
- Jenkins持续集成学习笔记(2020.11.22)
Jenkins持续集成学习笔记(2020.11.22) 前言: (官网) 以前很久学习过Jenkins持续集成进行快速部署项目进行测试, 最近换工作了, 发现新公司有用到, 现在来复习一下 官网介绍: ...
- ElasticSearch搜索引擎-2_学习笔记2021.4.18)
ElasticSearch搜索引擎-2_学习笔记(2021.4.18) 前言: RESTful 介绍 , 我们通过RESTful来操作ElasticSearch (所有请求都是通过Postman ) ...
- Bootstrap学习笔记01【快速入门、栅格布局】
Java后端 学习路线 笔记汇总表[黑马程序员] Bootstrap学习笔记01[快速入门.栅格布局][day01] Bootstrap学习笔记02[全局CSS样式.组件和插件.案例_黑马旅游网][d ...
- 「学习笔记」移动Web开发之flex布局9
「学习笔记」移动Web开发之flex布局9 一.flex布局体验 1.1 传统布局与flex布局 1.2 初体验 二.flex布局原理 2.1 布局原理 三.flex布局父项常见属性 3.1 常见父项 ...
- 架构方面学习笔记(3)-前端架构设计
2022.02.08 今天读了一篇关于前端整洁架构的设计,因此对其中的内容进行了一些整理以及我自己的思考,后续阅读<领域驱动设计>后可以加入更多的内容. References: 前端领域的 ...
最新文章
- 树结构遍历节点名字提取,这里提取的是el-tree数据结构,封装成函数
- VTK:图表之BreadthFirstDistance
- 计算机入会大会新生发言稿,新生大会发言稿(精选3篇)
- Factory Method工厂方法
- swing 显示文件下文件_Linux 文件权限详解
- 云图说|高效管理华为云SAP的“秘密武器”
- 理解storm的ACKER机制原理
- 模糊数学与matlab
- 基于 USB 传输的针式打印机驱动程序开发
- C++ 小游戏程序 (共七款)
- linux bzip2 命令,Linux bzip2 命令的使用
- win7(win10)更改“文件类型显示图标“的终极修改方法
- lvgl chart
- 风火牙疼,紧急止痛、快速治疗的真实历程
- 常用电路设计之PRBS伪随机码发生器的设计
- 2021-2027全球与中国草坪和花园用品市场现状及未来发展趋势
- 创建维基百科有什么作用?怎么编辑维基页面
- UIUC某童鞋收集的代码合集
- 东财《EXCEL在财务工作中的应用》综合作业
- 冈萨雷斯数字图像处理 - 感知要素
热门文章
- 王权富贵:使用终端向服务器传送文件
- 《利用python查询故宫门票是否售罄》—人生苦短,我用Python(八)
- Python3行代码翻译70种语言!这个OCR神器牛逼了!
- 個名字鞋類巨頭NIKE nike 門市銷售 FREE工作鞋有能
- 台式计算机连接投影仪无信号,投影仪连接电脑后无信号咋解决?
- QQ农场启示录之:坐忘峰的盈利模式
- 2021-10-26 linux 交互式shell脚本对话框----whiptail指令
- PHP接收云之家审批结果,云之家智能审批操作指引.PDF
- 二元函数对xy同时求导_【“数”你好看】求导
- dicom胶片展示,使用基石插件cornerstoneTools完成