分类 Code 下的文章

使用Qt开发UI,有一个工具是绕不开的,那就是QtDesigner。对于使用Python开发来说,我们需要把QtDesigner生产的.ui文件,转成对应的.py文件,才可以正常使用。(其实也有另一种方法是直接读取.ui文件,但这种方法的缺点是编程时没有代码补全。)如果涉及到资源文件.qrc,同样也需要转换成.py文件。

因此我们需要配置3个外部工具,分别是

  1. QtDesigner 用来编辑.ui文件
  2. UIC.ui文件转换为'py文件
  3. RCC.qrc文件转换为.py文件

省流版

新增外部工具

打开(或新建)一个工程,点文件->设置,打开设置界面,找到工具->外部工具,点+即可新增外部工具。按照以下图示创建3个外部工具。

新建外部工具

QtDesigner

QtDesigner

  • 程序路径

    C:\Users\username\AppData\Local\Programs\Python\Python310\Lib\site-packages\PySide6\designer.exe

    其中username为用户名,Python310为对应的Python版本,PySide6为对应的PySide或PyQt版本。此外,以上路径为Python的默认安装路径,如果你不是安装在默认路径,需要按实际情况修改。下同不复赘述。

  • 实参

    $FileName$
  • 工作目录

    $FileDir$

UIC

UIC

  • 程序路径

    C:\Users\username\AppData\Local\Programs\Python\Python310\Scripts\pyside6-uic.exe

    其中pyside6-uicpyside6为对应的PySide或PyQt版本,下同不复赘述。

  • 实参

    $FileName$ -o ui_$FileNameWithoutExtension$.py
  • 工作目录

    $FileDir$

RCC

RCC

  • 程序路径

    C:\Users\username\AppData\Local\Programs\Python\Python310\Scripts\pyside6-rcc.exe
  • 实参

    -o $FileNameWithoutExtension$_rc.py $FileName$
  • 工作目录

    $FileDir$

使用

QtDesigner

目前在PyCharm中无法直接新建.ui文件,只能手动打开QtDesigner新建.ui文件。
QtDesigner的目录具体参看上文QtDesigner的程序路径。此程序以后会经常使用,建议建立一个快捷方式。

生成.ui文件后,在.ui文件上右键,外部工具->QtDesigner,即可使用QtDesigner编辑。

编辑.UI文件

UIC

外部工具->UIC,即可把.ui文件转成.py文件。如mainwindow.ui会转为ui_mainwindow.py

RCC

外部工具->RCC,即可把.rcc文件转成.py文件。如icon.qrc会转为icon_rc.py

多了解点

外部工具

  • 名称:这个本身并没有什么特别支出,可按需任意取名,但考虑到实际使用体验,建议把UICRCC改个名字,方便操作时一眼认出。
  • 组:默认为外部工具,个人认为这也是最方便使用的。网上很多教程会让你把这几个外部工具列入二级分组,比如Qt,从组织整理上说,这种作法是对的,但如果你的开放环境只有这几个外部工具,其实没必要这样做,这样做会新增一个二级菜单,增加额外的操作。
  • 描述:相当于注释,可留空。
  • 程序:即要调用的外部程序所在的路径。
  • 实参:传入程序的参数,具体详见每个外部工具。
  • 工作目录:在哪个文件夹下调用该外部工具,具体详见每个外部工具。
  • 其他高级选项:保存默认即可(因为我也不懂)。

QtDesigner

如果使用命令行(或终端)调用该工具,完整命令为

PS D:\MyProject> C:\Users\username\AppData\Local\Programs\Python\Python310\Lib\site-packages\PySide6\designer.exe .\mainwindow.ui

运行以后,就会打开D:\MyProject下的mainwindow.ui文件。

实参mainwindow.ui,即当前文件名,可使用宏$FileName$获取。

工作目录D:\MyProject,即文件所在目录,可使用宏$FileDir$获取。网上很多教程会让你在这里使用$ProjectFileDir$,级项目所在目录。如果你的.ui文件是存在项目的根目录下,是可以正常运行的,因为此时项目目录就是文件所在目录。但如果不是,比如存放在src目录下,就会出错。

类似的宏还有很多,如有要全部记下来显然不现实,点击旁边的+按钮,即可在众多的宏中选择所需的宏。

选择宏

UIC

完整命令为

PS D:\MyProject> pyside6-uic .\mainwindow.ui -o ui_mainwindow.py

默认情况下,系统会把Python的第三方库加入path路径,所以在调用pyside6-uic.exe时无须填写冗长的完整路径,此外在Windows下,.exe也可以省略。

实参.\mainwindow.ui -o ui_mainwindow.py

其中mainwindow.ui为输入文件名,可用宏$FileName$获取。

新生成的文件名为ui_mainwindow.py,即ui_不含扩展名的文件名.py,其中不含扩展名的文件名可用宏$FileNameWithoutExtension$获取。

因此最后使用宏表示为$FileName$ -o ui_$FileNameWithoutExtension$.py

工作目录与上文一致,不再赘述。

RCC

完整命令为

PS D:\MyProject> pyside6-rcc -o icon_rc.py .\icon.qrc

请注意,实参部分,先传入的输出文件名icon_rc.py,再传入输入文件名icon.qrc,其他部分与前文的UIC内容是一样的道理,不再赘述。

如果使用Qt Designer设计界面,生成的ui文件,可以使用以下命令转换成py文件。

pyside2-uic main.ui > main.py

但如果设计中涉及到资源文件(如自定义图片),生产的main.py中会有import icon_rc,提示找不到文件,原因是没有转换对应的资源文件。

可以使用以下命令将qrc资源文件转换为py文件。

pyside2-rcc -o icon_rc.py icon.qrc

方法一

Public Function getWebSource(ByVal url As String) As String
    Try
        Dim stream As IO.Stream = WebRequest.Create(url).GetResponse().GetResponseStream()
        Dim sr As StreamReader = New StreamReader(stream, System.Text.Encoding.UTF8)
        Return sr.ReadToEnd()
    Catch ex As Exception
        Return ""
        'Return ex.ToString()
    End Try
End Function

方法二

节选自网络,实测较慢

Public Function GetWebCode(ByVal strURL As String) As String
    Dim httpReq As System.Net.HttpWebRequest
    Dim httpResp As System.Net.HttpWebResponse
    Dim httpURL As New System.Uri(strURL)
    Dim ioS As System.IO.Stream, charSet As String, tCode As String
    Dim k() As Byte
    ReDim k(0)
    Dim dataQue As New Queue(Of Byte)
    httpReq = CType(WebRequest.Create(httpURL), HttpWebRequest)
    Dim sTime As Date = CDate("1990-09-21 00:00:00")
    httpReq.IfModifiedSince = sTime
    httpReq.Method = "GET"
    httpReq.Timeout = 7000

    Try
        httpResp = CType(httpReq.GetResponse(), HttpWebResponse)
    Catch
        Debug.Print("weberror")
        GetWebCode = "<title>no thing found</title>" : Exit Function
    End Try
    '以上为网络数据获取
    ioS = CType(httpResp.GetResponseStream, Stream)
    Do While ioS.CanRead = True
        Try
            dataQue.Enqueue(ioS.ReadByte)
        Catch
            Debug.Print("read error")
            Exit Do
        End Try
    Loop
    ReDim k(dataQue.Count - 1)
    For j As Integer = 0 To dataQue.Count - 1
        k(j) = dataQue.Dequeue
    Next
    '以上,为获取流中的的二进制数据
    tCode = Encoding.GetEncoding("UTF-8").GetString(k) '获取特定编码下的情况,毕竟UTF-8支持英文正常的显示
    charSet = Replace(GetByDiv2(tCode, "charset=", """"), """", "") '进行编码类型识别
    '以上,获取编码类型
    If charSet = "" Then 'defalt
        If httpResp.CharacterSet = "" Then
            tCode = Encoding.GetEncoding("UTF-8").GetString(k)
        Else
            tCode = Encoding.GetEncoding(httpResp.CharacterSet).GetString(k)
        End If
    Else
        tCode = Encoding.GetEncoding(charSet).GetString(k)
    End If
    Debug.Print(charSet)
    'Stop
    '以上,按照获得的编码类型进行数据转换
    '将得到的内容进行最后处理,比如判断是不是有出现字符串为空的情况
    GetWebCode = tCode
    If tCode = "" Then GetWebCode = "<title>no thing found</title>"
End Function

Public Function GetByDiv2(ByVal code As String, ByVal divBegin As String, ByVal divEnd As String) '获取分隔符所夹的内容[完成,未测试]
'仅用于获取编码数据
    Dim lgStart As Integer
    Dim lens As Integer
    Dim lgEnd As Integer
    lens = Len(divBegin)
    If InStr(1, code, divBegin) = 0 Then GetByDiv2 = "" : Exit Function
    lgStart = InStr(1, code, divBegin) + CInt(lens)

    lgEnd = InStr(lgStart + 1, code, divEnd)
    If lgEnd = 0 Then GetByDiv2 = "" : Exit Function
    GetByDiv2 = Mid(code, lgStart, lgEnd - lgStart)
End Function

1.安装Newtonsoft.JSON

在【解决方案资源管理器】中右键项目,选择【管理 NuGet 程序包】

image

在浏览页面中搜索并安装Newtonsoft.Json即可

image

2. 导入Newtonsoft.Json

Imports Newtonsoft.Json
Imports Newtonsoft.Json.Linq

3.示例

json如下

{
    "message": null,
    "data": {
        "paginationData": [
            {
                "name": "管理员",
                "user_id": 16394,
                "groupsname": ""
            },
            {
                "name": "测试",
                "user_id": 16395,
                "groupsname": "部门A"
            },
            {
                "name": "隔壁老王",
                "user_id": 16396,
                "groupsname": "部门A"
            },
            {
                "name": "小明",
                "user_id": 16397,
                "groupsname": "部门B"
            }
        ],
        "result": 1
    }
}

image

先创建一个对应的结构体

Public Structure Employee
    Dim name As String
    Dim user_id As Integer
    Dim groupsname As String
End Structure

读取并解析json

Dim rawStr As String = System.IO.File.ReadAllText("D:\test.json")           '读取json文件,可根据实际情况替换对应语句
Dim p As JObject = CType(JsonConvert.DeserializeObject(rawStr), JObject)    '用json文本创建对象

MsgBox(p("message".ToString))                                               '读取值

Dim emp As List(Of Employee)                                                                        '创建对应的结构体列表
emp = JsonConvert.DeserializeObject(Of List(Of Employee))(p("data")("paginationData").ToString)     '如果有多层结构,可以继续添加p的子孙项
Dim empCount As Integer = emp.Count     '全部职员数量
MsgBox(emp(2).name & emp(2).user_id & emp(2).groupsname)    '结果为“隔壁老王16396部门A”

摘自网络

打开一个空白的Excel表格,按Alt + F11打开VBA界面,在左侧空白处右键,选择插入模块,然后输入以下代码:

Function pinyin(p As String) As String
    i = Asc(p)
    Select Case i
    Case -20319 To -20284: pinyin = "A"
    Case -20283 To -19776: pinyin = "B"
    Case -19775 To -19219: pinyin = "C"
    Case -19218 To -18711: pinyin = "D"
    Case -18710 To -18527: pinyin = "E"
    Case -18526 To -18240: pinyin = "F"
    Case -18239 To -17923: pinyin = "G"
    Case -17922 To -17418: pinyin = "H"
    Case -17417 To -16475: pinyin = "J"
    Case -16474 To -16213: pinyin = "K"
    Case -16212 To -15641: pinyin = "L"
    Case -15640 To -15166: pinyin = "M"
    Case -15165 To -14923: pinyin = "N"
    Case -14922 To -14915: pinyin = "O"
    Case -14914 To -14631: pinyin = "P"
    Case -14630 To -14150: pinyin = "Q"
    Case -14149 To -14091: pinyin = "R"
    Case -14090 To -13319: pinyin = "S"
    Case -13318 To -12839: pinyin = "T"
    Case -12838 To -12557: pinyin = "W"
    Case -12556 To -11848: pinyin = "X"
    Case -11847 To -11056: pinyin = "Y"
    Case -11055 To -2050: pinyin = "Z"
    Case Else: pinyin = p
    End Select
End Function

Function getpy(str)
    For i = 1 To Len(str)
    getpy = getpy & pinyin(Mid(str, i, 1))
    Next i
End Function

在Excel中即可调用自定义函数getpy获得拼音缩写,如=getpy(A1)