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消息列表,自定义控件来实现动态添加,使用数组来控制自定义控件)相关推荐

  1. Qt5学习笔记之零碎问题记录

    目录 概述 1.qDebug输出问题 1.1 qDebug() << "OK"报错 1.2 qDebug打印QString类型 2.QString字符串的操作 3.修改 ...

  2. Qt5学习笔记之串口助手四:增加16进制/ASCII切换、周期发送

    目录 1. 概述 2. 16进制/ASCII发送 2.1 功能实现 2.2 界面修改 3. 接收框显示发送内容 3.1 以16进制/ASCII显示 3.1.1 界面修改 3.1.2 功能实现 3.2 ...

  3. Qt5学习笔记之QString的使用

    目录 概述 2.QString字符串的操作 2.1 拼接 2.2 裁剪 2.3 转换为int型 2.4 int转换为QString 2.5 小写字母大写字母转换 2.6 转换为16进制 概述 学习过程 ...

  4. Qt5学习笔记之串口助手三:打包成Windows软件

    这里写目录标题 添加图标 打包程序 测试打包好的软件 添加图标 图标的获取可以参考我的另一篇文章:Qt5学习笔记之图标下载和转换,这里只记录下Qt中使用图标的方法. 1.切换到release模式下进行 ...

  5. Jenkins持续集成学习笔记(2020.11.22)

    Jenkins持续集成学习笔记(2020.11.22) 前言: (官网) 以前很久学习过Jenkins持续集成进行快速部署项目进行测试, 最近换工作了, 发现新公司有用到, 现在来复习一下 官网介绍: ...

  6. ElasticSearch搜索引擎-2_学习笔记2021.4.18)

    ElasticSearch搜索引擎-2_学习笔记(2021.4.18) 前言: RESTful 介绍 , 我们通过RESTful来操作ElasticSearch (所有请求都是通过Postman ) ...

  7. Bootstrap学习笔记01【快速入门、栅格布局】

    Java后端 学习路线 笔记汇总表[黑马程序员] Bootstrap学习笔记01[快速入门.栅格布局][day01] Bootstrap学习笔记02[全局CSS样式.组件和插件.案例_黑马旅游网][d ...

  8. 「学习笔记」移动Web开发之flex布局9

    「学习笔记」移动Web开发之flex布局9 一.flex布局体验 1.1 传统布局与flex布局 1.2 初体验 二.flex布局原理 2.1 布局原理 三.flex布局父项常见属性 3.1 常见父项 ...

  9. 架构方面学习笔记(3)-前端架构设计

    2022.02.08 今天读了一篇关于前端整洁架构的设计,因此对其中的内容进行了一些整理以及我自己的思考,后续阅读<领域驱动设计>后可以加入更多的内容. References: 前端领域的 ...

最新文章

  1. 树结构遍历节点名字提取,这里提取的是el-tree数据结构,封装成函数
  2. VTK:图表之BreadthFirstDistance
  3. 计算机入会大会新生发言稿,新生大会发言稿(精选3篇)
  4. Factory Method工厂方法
  5. swing 显示文件下文件_Linux 文件权限详解
  6. 云图说|高效管理华为云SAP的“秘密武器”
  7. 理解storm的ACKER机制原理
  8. 模糊数学与matlab
  9. 基于 USB 传输的针式打印机驱动程序开发
  10. C++ 小游戏程序 (共七款)
  11. linux bzip2 命令,Linux bzip2 命令的使用
  12. win7(win10)更改“文件类型显示图标“的终极修改方法
  13. lvgl chart
  14. 风火牙疼,紧急止痛、快速治疗的真实历程
  15. 常用电路设计之PRBS伪随机码发生器的设计
  16. 2021-2027全球与中国草坪和花园用品市场现状及未来发展趋势
  17. 创建维基百科有什么作用?怎么编辑维基页面
  18. UIUC某童鞋收集的代码合集
  19. 东财《EXCEL在财务工作中的应用》综合作业
  20. 冈萨雷斯数字图像处理 - 感知要素

热门文章

  1. 王权富贵:使用终端向服务器传送文件
  2. 《利用python查询故宫门票是否售罄》—人生苦短,我用Python(八)
  3. Python3行代码翻译70种语言!这个OCR神器牛逼了!
  4. 個名字鞋類巨頭NIKE nike 門市銷售 FREE工作鞋有能
  5. 台式计算机连接投影仪无信号,投影仪连接电脑后无信号咋解决?
  6. QQ农场启示录之:坐忘峰的盈利模式
  7. 2021-10-26 linux 交互式shell脚本对话框----whiptail指令
  8. PHP接收云之家审批结果,云之家智能审批操作指引.PDF
  9. 二元函数对xy同时求导_【“数”你好看】求导
  10. dicom胶片展示,使用基石插件cornerstoneTools完成