C# 格式化字符串

原文地址:http://www.cnblogs.com/zyh-nhy/archive/2007/10/11/921240.html

1 前言

如果你熟悉Microsoft Foundation Classes(MFC)的CString,Windows Template Library(WTL)的CString或者Standard Template Library(STL)的字符串类,那么你对String.Format方法肯定很熟悉。在C#中也经常使用这个方法来格式化字符串,比如下面这样:

1 int x = 16;
2 decimal y = 3.57m;
3 string h = String.Format( "item {0} sells at {1:C}", x, y );
4 Console.WriteLine(h);

 

在我的机器上,可以得到下面的输出:

item 16 sells at ¥3.57

 

也许你的机器上的输出和这个不太一样。这是正常的,本文稍后就会解释这个问题。
在我们日常使用中,更多的是使用Console.WriteLine方法来输出一个字符串。其实String.Format和Console.WriteLine有很多共同点。两个方法都有很多重载的格式并且采用无固定参数的对象数组作为最后一个参数。下面的两个语句会产生同样的输出。

1 Console.WriteLine( "Hello {0} {1} {2} {3} {4} {5} {6} {7} {8}", 123, 45.67, true, 'Q', 4, 5, 6, 7, '8');
2 string u = String.Format("Hello {0} {1} {2} {3} {4} {5} {6} {7} {8}", 123, 45.67, true, 'Q', 4, 5, 6, 7, '8');
3 Console.WriteLine(u);

 

输出如下:

1 Hello 123 45.67 True Q 4 5 6 7 8
2 Hello 123 45.67 True Q 4 5 6 7 8

 

2 字符串格式

String.Format和WriteLine都遵守同样的格式化规则。格式化的格式如下:"{ N [, M ][: formatString ]}", arg1, ... argN,在这个格式中:

1) N是从0开始的整数,表示要格式化的参数的个数

2) M是一个可选的整数,表示格式化后的参数所占的宽度,如果M是负数,那么格式化后的值就是左对齐的,如果M是正数,那么格式化后的值是右对齐的

3) formatString是另外一个可选的参数,表示格式代码

argN表示要格式化的表达式,和N是对应的。

如果argN是空值,那么就用一个空字符串来代替。如果没有formatString,那么就用参数N对应的ToString方法来格式化。下面的语句会产生同样的输出:

1 public class TestConsoleApp
2 {
3     public static void Main(string[] args)
4     {
5         Console.WriteLine(123);
6         Console.WriteLine("{0}", 123);
7         Console.WriteLine("{0:D3}", 123);
8     }
9 }

 

输出是:

123
123
123

也可以通过String.Format得到同样的输出。

1 string s = string.Format("123");
2 string t = string.Format("{0}", 123);
3 string u = string.Format("{0:D3}", 123);
4 Console.WriteLine(s);
5 Console.WriteLine(t);
6 Console.WriteLine(u);

因此有如下结论:
(,M)决定了格式化字符串的宽度和对齐方向

(:formatString)决定了如何格式化数据,比如用货币符号,科学计数法或者16进制。就像下面这样:

1 Console.WriteLine("{0,5} {1,5}", 123, 456);      // 右对齐
2 Console.WriteLine("{0,-5} {1,-5}", 123, 456);    // 左对齐

输出是:

123   456
123   456

也可以合并这些表达式,先放一个逗号,再放一个冒号。就像这样:

Console.WriteLine("{0,-10:D6} {1,-10:D6}", 123, 456);

输出是:

000123     000456

我们可以用这种格式化特性来对齐我们的输出。

1 Console.WriteLine("\n{0,-10}{1,-3}", "Name","Salary");
2 Console.WriteLine("----------------");
3 Console.WriteLine("{0,-10}{1,6}", "Bill", 123456);
4 Console.WriteLine("{0,-10}{1,6}", "Polly", 7890);

输出是:

Name      Salary
----------------
Bill      123456
Polly       7890

3 格式化标识符
标准的数学格式字符串用于返回通常使用的字符串。它们通常象X0这样的格式。X是格式化标识符,0是精度标识符。格式标识符号共有9种,它们代表了大多数常用的数字格式。就像下表所示:

字母 含义
C或cCurrency 货币格式
D或dDecimal 十进制格式(十进制整数,不要和.Net的Decimal数据类型混淆了)
E或eExponent 指数格式
F或fFixed point 固定精度格式
G或gGeneral 常用格式
N或n用逗号分割千位的数字,比如1234将会被变成1,234
P或pPercentage 百分符号格式
R或rRound-trip  圆整(只用于浮点数)保证一个数字被转化成字符串以后可以再被转回成同样的数字
X或xHex 16进制格式


如果我们使用下面的表达方式,让我们看看会发生什么

 1 public class FormatSpecApp
 2 {
 3     public static void Main(string[] args)
 4     {
 5         int i = 123456;
 6         Console.WriteLine("{0:C}", i); // ¥123,456.00
 7         Console.WriteLine("{0:D}", i); // 123456
 8         Console.WriteLine("{0:E}", i); // 1.234560E+005
 9         Console.WriteLine("{0:F}", i); // 123456.00
10         Console.WriteLine("{0:G}", i); // 123456
11         Console.WriteLine("{0:N}", i); // 123,456.00
12         Console.WriteLine("{0:P}", i); // 12,345,600.00 %
13         Console.WriteLine("{0:X}", i); // 1E240
14     }
15 }

 

精度控制标识控制了有效数字的个数或者十进制数小数的位数。

1 Console.WriteLine("{0:C5}", i); // ¥123,456.00
2 Console.WriteLine("{0:D5}", i); // 123456
3 Console.WriteLine("{0:E5}", i); // 1.23456E+005
4 Console.WriteLine("{0:F5}", i); // 123456.00000
5 Console.WriteLine("{0:G5}", i); // 1.23456E5
6 Console.WriteLine("{0:N5}", i); // 123,456.00000
7 Console.WriteLine("{0:P5}", i); // 12,345,600.00000 %
8 Console.WriteLine("{0:X5}", i); // 1E240

 

R(圆整)格式仅仅对浮点数有效。这个值首先会用通用格式来格式化。对于双精度数有15位精度,对于单精度数有7位精度。如果这个值可以被正确地解析回原始的数字,就会用通用格式符来格式化。如果不能解析回去的话,那么就会用17位精度来格式化双精度数,用9位精度来格式化单精度数。尽管我们可以在圆整标识符后面添加有效数字的位数,但是它会被忽略掉。

1 double d = 1.2345678901234567890;
2 Console.WriteLine("Floating-Point:\t{0:F16}", d);  // 1.2345678901234600
3 Console.WriteLine("Roundtrip:\t{0:R16}", d);       // 1.2345678901234567

如果标准格式化标识符还不能满足你。你可以使用图形化格式字符串来创建定制的字符串输出。图形化格式化使用占位符来表示最小位数,
最大位数,定位符号,负号的外观以及其它数字符号的外观。就像下表所示

 符号名称含义
00占位符用0填充不足的位数
#数字占位符用#代替实际的位数
.十进制小数点 
,千位分隔符用逗号进行千位分割,比如把1000分割成1,000
%百分符号显示一个百分标识
E+0
E-0
e+0
e-0
指数符号用指数符号格式化输出
\专一字符用于传统格式的格式化序列,比如"\n"(新行)
'ABC'
"ABC"
常量字符串 显示单引号或者双引号里面的字符串
;区域分隔符 如果数字会被格式化成整数,负数,或者0,用;来进行分隔
,.缩放符号数字除以1000


看下面的例子:

 1 double i = 123456.42;
 2             Console.WriteLine();
 3             Console.WriteLine("{0:000000.00}", i); //123456.42
 4             Console.WriteLine("{0:00.00000000e+0}", i); //12.34564200e+4
 5             Console.WriteLine("{0:0,.}", i);          //123
 6             Console.WriteLine("{0:#0.000}", i);             // 123456.420
 7             Console.WriteLine("{0:#0.000;(#0.000)}", i);        // 123456.420
 8             Console.WriteLine("{0:#0.000;(#0.000);<zero>}", i); // 123456.420
 9             Console.WriteLine("{0:#%}", i);     // 12345642%
10 
11             i = -123456.42;
12             Console.WriteLine();
13             Console.WriteLine("{0:000000.00}", i); //-123456.42
14             Console.WriteLine("{0:00.00000000e+0}", i); //-12.34564200e+4
15             Console.WriteLine("{0:0,.}", i);          //-123
16             Console.WriteLine("{0:#0.000}", i);             // -123456.420
17             Console.WriteLine("{0:#0.000;(#0.000)}", i);        // (123456.420)
18             Console.WriteLine("{0:#0;(#0);<zero>}", i); // (123456)
19             Console.WriteLine("{0:#%}", i);             // -12345642%
20 
21             i = 0;
22             Console.WriteLine();
23             Console.WriteLine("{0:0,.}", i);          //0
24             Console.WriteLine("{0:#0}", i);             // 0
25             Console.WriteLine("{0:#0;(#0)}", i);        // 0
26             Console.WriteLine("{0:#0;(#0);<zero>}", i); // <zero>
27             Console.WriteLine("{0:#%}", i);             // %

4 数字字符串的解析

所有的基础类型都有ToString方法,它是从object类型中继承过来的。所有的数值类型都有Parse方法,它用字符串为参数,并且返回相等的数值。比如

public class NumParsingApp
{
    public static void Main(string[] args)
    {
        int i = int.Parse("12345");
        Console.WriteLine("i = {0}", i);

        int j = Int32.Parse("12345");
        Console.WriteLine("j = {0}", j);

        double d = Double.Parse("1.2345E+6");
        Console.WriteLine("d = {0:F}", d);

        string s = i.ToString();
        Console.WriteLine("s = {0}", s);
    }
}


输出如下

i = 12345
j = 12345
d = 1234500.00
s = 12345


在缺省状况下,某些非数字字符是可以存在的。比如开头和结尾的空白。逗号和小数点,加号和减号,因此,下面的Parse语句是一样的

string t = "  -1,234,567.890  ";
//double g = double.Parse(t);        // 和下面的代码干同样的事情
double g = double.Parse(t, 
    NumberStyles.AllowLeadingSign | 
    NumberStyles.AllowDecimalPoint |
    NumberStyles.AllowThousands |
    NumberStyles.AllowLeadingWhite | 
    NumberStyles.AllowTrailingWhite);
Console.WriteLine("g = {0:F}", g);


输出都是这样

g = -1234567.89


注意到,如果你要使用NumberStyles,就要添加对System.Globalization的引用,然后就可以使用不同NumberStyles的组合或者其中的任意一种。如果你想兼容货币符号,就需要使用重载的Parse方法,它们采用了NumberFormatInfo对象作为一个参数,然后你可以设置NumberFormatInfo的CurrencySymbol属性来调用Parse方法,比如:

string u = "¥  -1,234,567.890  ";
NumberFormatInfo ni = new NumberFormatInfo();
ni.CurrencySymbol = "¥";
double h = Double.Parse(u, NumberStyles.Any, ni);
Console.WriteLine("h = {0:F}", h);


上面的代码有如下输出

h = -1234567.89


除了NumberFormatInfo,还可以使用CultureInfo类。CultureInfo代表了某种特定的文化,包括文化的名字,书写的方式,日历的格式。对于某种特定文化的操作是非常普遍的情况,比如格式化日期和排序。文化的命名方式遵从RFC1766标准,使用<语言代码2>-<国家/地区码2>的方式,其中的<语言代码2>是两个小写的字母,它们来自ISO639-1;<国家/地区码2>是两个大写字母,它们来自ISO3166。比如,美国英语是“en-US"。英国英语是"en-GB"。特立尼达和多巴哥英语是"en-TT"。例如,我们可以创建一个美国英语的CultureInfo对象并且基于这种文化将数字转换成字符串。

int k = 12345;
CultureInfo us = new CultureInfo("en-US");
string v = k.ToString("c", us);
Console.WriteLine(v);


输出是:

$12,345.00


要注意到,我们使用了重载的ToString方法,它把第一个格式化字符串当成第一个参数,将一个CultureInfo对象(执行了IFormatProvider对象)作为第二个参数。这儿有第二个例子,对于丹麦人来说:

CultureInfo dk = new CultureInfo("da-DK");
string w = k.ToString("c", dk);
Console.WriteLine(w);


输出是:

kr 12.345,00


5 字符串和日期

一个日期对象有个叫Ticks的属性。它存储了自从公元1年的1月1号上午12点开始的,以100纳秒为间隔的时间。比如,Ticks值等于31241376000000000L表示公元100年,星期五,1月1号,上午12点这一时间。Ticks总是以100纳秒为间隔递增。

DateTime的值以存储在DateTimeFormatInfo实例里面的标准或者自定义的方式来表示。为了修改一个日期显示的方式,DateTimeFormatInfo实例必须要是可写的,以便我们写入自定义的格式并且存入属性中

using System.Globalization;

public class DatesApp
{
    public static void Main(string[] args)
    {
        DateTime dt = DateTime.Now;
        Console.WriteLine(dt);
        Console.WriteLine("date = {0}, time = {1}\n",
            dt.Date, dt.TimeOfDay);
    }
}


代码会产生下面的输出

23/06/2001 17:55:10
date = 23/06/2001 00:00:00, time = 17:55:10.3839296


下表列出了标准的格式字符串以及相关的DateTimeFormatInfo属性

D  
DMM/dd/yyyyShortDatePattern(短日期模式)
Ddddd,MMMM dd,yyyy   LongDatePattern(长日期模式)
Fdddd,MMMM dd,yyyy HH:mmFull date and time (long date and short time)(全日期和时间模式)
Fdddd,MMMM dd,yyyy HH:mm:ssFullDateTimePattern (long date and long time)(长日期和长时间)
GMM/dd/yyyy HH:mmGeneral (short date and short time)(通用模式,短日期和短时间)
GMM/dd/yyyy HH:mm:ssGeneral (short date and long time)(通用模式,短日期和长时间)
M,MMMMM dd MonthDayPattern(月天模式)
r,Rddd,dd MMM yyyy,HH':'mm':'ss 'GMT'RFC1123Pattern (RFC1123模式)
Syyyy-MM-dd HH:mm:ss SortableDateTimePattern (conforms to ISO 8601) using local time(使用本地时间的可排序模式)
THH:mm ShortTimePattern (短时间模式)
THH:mm:ssLongTimePattern(长时间模式)
Uyyyy-MM-dd HH:mm:ssUniversalSortable-DateTimePattern (conforms to ISO 8601) using universal time(通用可排序模式)
Udddd,MMMM dd,yyyy,HH:mm:ssUniversalSortable-DateTimePattern(通用可排序模式)
y,YMMMM,yyyyYearMonthPattern(年月模式)


DateTimeFormatInfo.InvariantInfo属性得到了默认的只读的DateTimeFormatInfo实例,它与文化无关。你可以创建自定义的模式。要注意到的是InvariantInfo不一定和本地的格式一样。Invariant等于美国格式。另外,如果你向DateTime.Format方法传递的第二个参数是null,DateTimeFormatInfo将会是默认的CurrentInfo。比如

Console.WriteLine(dt.ToString("d", dtfi));
Console.WriteLine(dt.ToString("d", null));
Console.WriteLine();


输出是

06/23/2001
23/06/2001


对比选择InvariantInfo和CurrentInfo的。

DateTimeFormatInfo dtfi;
Console.Write("[I]nvariant or [C]urrent Info?: ");
if (Console.Read() == 'I')
    dtfi = DateTimeFormatInfo.InvariantInfo;
else
    dtfi = DateTimeFormatInfo.CurrentInfo;
DateTimeFormatInfo dtfi = DateTimeFormatInfo.InvariantInfo;
Console.WriteLine(dt.ToString("D", dtfi));
Console.WriteLine(dt.ToString("f", dtfi));
Console.WriteLine(dt.ToString("F", dtfi));
Console.WriteLine(dt.ToString("g", dtfi));
Console.WriteLine(dt.ToString("G", dtfi));
Console.WriteLine(dt.ToString("m", dtfi));
Console.WriteLine(dt.ToString("r", dtfi));
Console.WriteLine(dt.ToString("s", dtfi));
Console.WriteLine(dt.ToString("t", dtfi));
Console.WriteLine(dt.ToString("T", dtfi));
Console.WriteLine(dt.ToString("u", dtfi));
Console.WriteLine(dt.ToString("U", dtfi));
Console.WriteLine(dt.ToString("d", dtfi));
Console.WriteLine(dt.ToString("y", dtfi));
Console.WriteLine(dt.ToString("dd-MMM-yy", dtfi));


输出是

[I]nvariant or [C]urrent Info?: I
01/03/2002
03/01/2002

Thursday, 03 January 2002
Thursday, 03 January 2002 12:55
Thursday, 03 January 2002 12:55:03
01/03/2002 12:55
01/03/2002 12:55:03
January 03
Thu, 03 Jan 2002 12:55:03 GMT
2002-01-03T12:55:03
12:55
12:55:03
2002-01-03 12:55:03Z
Thursday, 03 January 2002 12:55:03
01/03/2002
2002 January
03-Jan-02


[I]nvariant or [C]urrent Info?: C
03/01/2002
03/01/2002

03 January 2002
03 January 2002 12:55
03 January 2002 12:55:47
03/01/2002 12:55
03/01/2002 12:55:47
03 January
Thu, 03 Jan 2002 12:55:47 GMT
2002-01-03T12:55:47
12:55
12:55:47
2002-01-03 12:55:47Z
03 January 2002 12:55:47
03/01/2002
January 2002
03-Jan-02


/******************************************************************************************
 *【Author】:flyingbread
 *【Date】:2007年1月18日
 *【Notice】:
 *1、本文为原创技术文章,首发博客园个人站点(http://flyingbread.cnblogs.com/),转载和引用请注明作者及出处。
 *2、本文必须全文转载和引用,任何组织和个人未授权不能修改任何内容,并且未授权不可用于商业。
 *3、本声明为文章一部分,转载和引用必须包括在原文中。
 ******************************************************************************************/

转载于:https://www.cnblogs.com/npucloud/articles/6212997.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/255718.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据库学习笔记】——操作sqlite(增删改查)以及cursor的方法介绍

目录 1、sqlite数据库介绍 1&#xff09;常见的数据库操作 2&#xff09;数据操作常见步骤 2、向数据表中增加数据&#xff08;insert into&#xff09; 1&#xff09;向数据表中添加一条记录 2&#xff09;向数据表中一次性添加多条记录 ​ 3、修改数据表中已有的数据 1)…

【sqlite常用操作SQL语句】

目录 1、创建一个新的数据表 2、在已有的数据表中增加一个新的字段&#xff08;列&#xff09; 3、 在已有的数据表中增加一条新的记录&#xff08;行&#xff09; 1、创建一个新的数据表 "create table user(id int(11) primary key, name varchar(20))" 含义&…

centos6虚拟机复制后修改网卡

方法1&#xff1a; 使用vmware创建centos6.4虚拟机&#xff0c; 创建完成后复制该虚拟机&#xff0c; 打开复制的虚拟机发现网卡名字是eth1&#xff0c;而网卡配置文件为eth0&#xff0c;mac地址变了 这时修改网卡配置文件&#xff0c; 删除uuid&#xff0c;修改deivce为eth1&a…

【pyinstaller打包pyqt5编写的项目为exe(脱离环境可运行)】

目录 下载pyinstaller库 0、pyinstaller语句介绍 1、单个py文件打包成exe 1)只有py文件 假设只有一个py文件&#xff1a;pyinstaller -F xxx.py 加上图标&#xff1a;pyinstaller -F xxx.py -i xxx.ico 取消命令行窗口:pyinstaller -F -w xxx.py -i xxx.ico 2) 不但有py…

python 中cPickle学习二

写入&#xff1a; import cPickle as p shoplistfile data.data shoplist [meili,[current_account,[100000,1222],basis_account,[5555555,888]],qinshan,[current_account,[1089000,12292],basis_account,[55555955,888]],jiayou,[current_account,[10000,12292],basis_acc…

4.0 多线程基础篇

本文并非最终版本&#xff0c;如有更新或更正会第一时间置顶&#xff0c;联系方式详见文末如果觉得本文内容过长&#xff0c;请前往本人 “简书”4.0-1.1 进程 概念 : 进程是指在系统中正在运行的一个应用程序 (操作系统中每一个 APP 就是一个进程)  性质 : 每个进程之间是独…

【python pandas excel操作】

目录 1、打开Excel&#xff0c;获取不同sheet的名称 2、获取不同sheet的内容 3、 获取行数以及表头 4、对某一列的信息进行筛选 5、根据列号和索引号提取一行或者一列的数据 6、其他panda对Excel的操作 摘自&#xff1a;python对excel操作获取某一列&#xff0c;某一行的值…

线性期望(BUPT2015校赛.F)

将整体期望分成部分期望来做。 F. network 时间限制 3000 ms 内存限制 65536 KB题目描述 A social network is a social structure made up of a set of social actors (such as individuals or organizations) and a set of the relationships between these actors. In simp…

【pyqt5学习】——进度条progressBar

# 进度条 self.progressBar.setValue(0) # 设置进度条的最小值 self.progressBar.setMaximum(100) # 设置进度条的最大值 # 设置进度条当前值 self.progressBar.setValue((int(curindex/excelNum)*100)) 常用方法 方法值说明setRangeQProgressBar.setRange(min, Max)通过 setR…

弧焊 不同气体对焊缝的影响 100二氧化碳 15%氩气CO2混合

Ar含量提高后&#xff0c;相比原来的100%CO2成本会提高很多。 Ar的密度比CO2小&#xff0c;焊接的焊枪必须压的很低&#xff0c;如果焊接结构中有一些狭小区域&#xff0c;焊枪则无法到达。纯CO2气体保护焊&#xff0c;焊丝可伸出较长。 Ar属于惰性气体&#xff0c;焊接时…

Windows和Linux如何使用Java代码实现关闭进程

在用selenium做自动化测试时&#xff0c;由于各种不明原因&#xff0c;有时Chrome浏览器会出现假死的情况&#xff0c;也就是整个浏览器响应超时&#xff0c;本人脚本主要部署在Windows机器上&#xff0c;所以主要以Windows为主&#xff0c;浏览器为Chrome,即如下图所示 或者由…

【pyqt5学习】——下拉框comboBox

# 向下拉框中添加选型&#xff0c;具体为在下拉框第index1个选型设置为内容name self.comboBox.addItem(name,index1) # 将下拉框中所有的选项删除 self.comboBox.clear() # 根据索引获取当前的下拉框内容 index self.comboBox.currentIndex() text self.comboBox.itemText(i…

【文件处理】——Python pandas 写入数据到excel中

目录 1、创建一个新的excel表格 2、 获取写入excel的数据data 3、将data类型转换为pandas接受的类型 4、写入到excel中 5、保存excel 最终结果 #!/usr/bin/env python # -*- coding: utf-8 -*- # Time : 2021/11/9 23:18 # Author : linlianqin # Site : # File …

微软Visual Studio 2012软件功能介绍

对于从事.net程序开发的我们&#xff0c;都要用到C#依附的Visual Studio平台!Visual Studio是目前最流行的Windows平台应用程序开发环境。最新版本为 Visual Studio 2012 版本&#xff0c;基于 NET Framework4.5 。. Visual Studio 2012内置的测试工具可以帮助开发者打造高质量…

Spring Boot轻松理解动态注入,删除bean

2019独角兽企业重金招聘Python工程师标准>>> 我们通过getBean来获得对象,但这些对象都是事先定义好的,我们有时候要在程序中动态的加入对象.因为如果采用配置文件或者注解&#xff0c;我们要加入对象的话,还要重启服务,如果我们想要避免这一情况就得采用动态处理bea…

对象的深度克隆

最近在复习javascript&#xff0c;然而我的读书笔记&#xff0c;以及技术博客&#xff0c;已经转战cmd Markdown。所以这里就只写了一个对象的深度克隆方法&#xff1a; 这个克隆方法可以让我很深刻的了解到了js中&#xff0c;万物皆对象&#xff0c;对js有更深入的了解。转载于…

C/C++语言变量声明内存分配

[cpp] view plaincopy<span style"font-family: Verdana, Arial, Helvetica, sans-serif; ">一个由c/C编译的程序占用的内存分为以下几个部分</span> 1、栈区&#xff08;stack&#xff09;— 程序运行时由编译器自动分配&#xff0c;存放函数的参数值…

【pyqt5学习】——items view相关控件(list view、table view)

目录 list view——列表视图 table view——表格视图 list view——列表视图 PyQt5-高级控件使用&#xff08;QListView&#xff09; - ygzhaof_100 - 博客园QListView用于展示数据&#xff0c;子类是QListWidget。QlistView基于模型Mode&#xff0c;需要程序创建Model然后保…

【pyqt5学习】——containers相关控件(tab widget、scroll area、stack widget、tool box、MDI area、dock widget)

目录 1、tab widget 2、scroll area 2.1 使用方法 Step1.拖入QScrollArea ​Step2.改变widget控件布局 ​Step3.设置scrollAreaWidgetContents大小 3、Tool Box 4、Stacked Widget 4.1 案例展示 5、frame 6、MDI AREA 7、dock widget 7.1 悬浮状态 7.2 吸附状态 conta…