ptz 发布的文章

samba 共享的文件,被修改后,会被增加执行位。 要保留原来的属性,只需要修改 /etc/samba/smb.conf

[global]
......
      map archive = no

参考: https://stackoverflow.com/questions/20958888/preserving-file-permissions-for-samba-shares-when-file-is-edited https://en.wikipedia.org/wiki/Archive_bit https://www.linuxquestions.org/questions/linux-server-73/samba-adds-execute-flag-to-all-new-files-783263/ https://www.samba.org/samba/docs/using_samba/ch08.html

1. 使用命令 qmlscene 可以直接执行 qml 文件。

2. qml 中 quick 对应的版本

Qt QtQml QtQml.Models QtQuick QtQuick.Controls QtQuick.Layouts QtQuick.Dialogs QtQuick.Particles 4.7.1 1.0
4.7.4 1.1
5.0 2.0 2.0 2.0 5.1 2.1 2.1 2.1 1.0 1.0 1.0 2.0 5.2 2.2 2.1 2.2 1.1 1.1 1.1 2.0 5.3 2.2 2.1 2.3 1.2 1.1 1.2 2.0 5.4 2.2 2.1 2.4 1.3 1.1 1.2 2.0 5.5 2.2 2.2 2.5 1.4 1.2 1.2 2.0 5.6 2.2 2.2 2.5 1.5 1.3 1.2 2.0 5.7 2.2 2.2 2.7 2.0 1.3 1.2 2.0 5.8 2.2 2.2 2.7 2.1 1.3 1.2 2.0 5.9 2.2 2.2 2.7 2.2 1.3 1.2 2.0 5.10 2.2 2.2 2.7 2.3 1.3 1.3 2.0 5.11 2.11 2.11 2.11 2.4 1.11 1.3 2.11 5.12 2.12 2.12 2.12 2.5 1.12 1.3 2.12 5.13 2.13 2.13 2.13 2.13 1.13 1.3 2.13 … … … … … … … …

参考: https://beyondyuanshu.github.io/2019/11/19/qt-qml-quick-andsoon.html

3. 自定义标题栏和实现鼠标拖动

参考: https://blog.csdn.net/laughing_cui/article/details/74025206

1. 安装见

https://www.cnblogs.com/ramlife/p/14096103.html
http://www.ramlife.org/2020/12/07/272.html

2. 安装好后,import 一下,看看有没有问题。

python3

import PyQt5

exit()

3. 用 qtdesigner 做一个只有 label 的 ui,然后在 ui文件的 同目录下新建一个 py 文件。

#!/usr/bin/python3

import sys
from PyQt5.uic import loadUi
from PyQt5.QtWidgets import QMainWindow, QApplication

class MainWindow(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        loadUi("test.ui", self)

app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec())

这样就可以直接使用这个 ui 文件了。 这里面使用的 api 是 loadUi,而不是 loadUiType,所以不需要 setupUi 和 super。 所有 ui 界面里面的东西可以直接用 self 来调用了。比如 self.pushButton.clicked.connect(ShowString)

参考: https://blog.csdn.net/josephzhang1012/article/details/86696107

4. pyqt5 qml 简单例子

main.qml

import QtQuick.Window 2.2
import QtQuick 2.3

Window {
visible:true
width:600
height:400
color:"yellow"
title: "PyQt5 QML Window"
}

main.py

from PyQt5.QtQml import QQmlApplicationEngine
from PyQt5.QtWidgets import QApplication
from PyQt5.QtGui import QIcon
import sys

def runQML():
    app =QApplication(sys.argv)
    engine = QQmlApplicationEngine()
    app.setWindowIcon(QIcon("icon.png"))
    engine.load('main.qml')

    if not engine.rootObjects():
        return -1

    return app.exec_()

if __name__ == "__main__":
    sys.exit(runQML())

执行 main.py,就可以出现窗口了。

参考: https://codeloop.org/how-to-create-window-in-pyqt5-qtquick/

5. 信号与槽

from PyQt5.QtCore import QObject , pyqtSignal

class CustSignal(QObject):

    #声明无参数的信号
    signal1 = pyqtSignal()

    #声明带一个int类型参数的信号
    signal2 = pyqtSignal(int)

    #声明带int和str类型参数的信号
    signal3 = pyqtSignal(int,str)

    #声明带一个列表类型参数的信号
    signal4 = pyqtSignal(list)

    #声明带一个字典类型参数的信号
    signal5 = pyqtSignal(dict)

    #声明一个多重载版本的信号,包括带int和str类型参数的信号和带str类型参数的信号
    signal6 = pyqtSignal([int,str], [str])

    def __init__(self,parent=None):
        super(CustSignal,self).__init__(parent)

        #将信号连接到指定槽函数
        self.signal1.connect(self.signalCall1)
        self.signal2.connect(self.signalCall2)
        self.signal3.connect(self.signalCall3)
        self.signal4.connect(self.signalCall4)
        self.signal5.connect(self.signalCall5)
        self.signal6[int,str].connect(self.signalCall6)
        self.signal6[str].connect(self.signalCall6OverLoad)

        #发射信号
        self.signal1.emit()
        self.signal2.emit(1)
        self.signal3.emit(1,"text")
        self.signal4.emit([1,2,3,4])
        self.signal5.emit({"name":"wangwu","age":"25"})
        self.signal6[int,str].emit(1,"text")
        self.signal6[str].emit("text")

    def signalCall1(self):
        print("signal1 emit")

    def signalCall2(self,val):
        print("signal2 emit,value:",val)

    def signalCall3(self,val,text):
        print("signal3 emit,value:",val,text)

    def signalCall4(self,val):
        print("signal4 emit,value:",val)

    def signalCall5(self,val):
        print("signal5 emit,value:",val)

    def signalCall6(self,val,text):
        print("signal6 emit,value:",val,text)

    def signalCall6OverLoad(self,val):
        print("signal6 overload emit,value:",val)

if __name__ == '__main__':  
    custSignal = CustSignal()

参考: https://www.cnblogs.com/XJT2018/p/10222981.html https://blog.csdn.net/qq_38463737/article/details/107806432

6. button 设置样式表

    self.mBtnRecord.setStyleSheet("QPushButton{border-image: url(./assets/ico-常规背景.svg)} \
        QPushButton:hover{border-image: url(./assets/ico-选中后背景.svg)} \
        QPushButton:checked{border-image: url(./assets/ico-保持背景.svg)} \
        QPushButton:pressed{border-image: url(./assets/ico-点击背景.svg)} \
        QPushButton:disabled{border-image: url(./assets/ico-不可用背景.svg)}")

参考: https://blog.csdn.net/jays_/article/details/83785898 https://blog.csdn.net/weixin_47142322/article/details/105976861 https://www.cnblogs.com/xj626852095/p/3648119.html https://www.cnblogs.com/aheng123/p/5630761.html

7. button 设置持续按下

        self.mBtnRecord.setCheckable(True)
        self.mBtnRecord.setChecked(False)

检查按钮按下的情况

        if self.mBtnRecord.isChecked() is False:
            ...
        else:
            ...

参考: https://blog.csdn.net/qiangzi4646/article/details/80135120 https://www.cnblogs.com/lomper/p/4249575.html

8. button 按下换图标:

self.mBtnSpeed.setIcon(QIcon('./assets/ico-' + "变速" + '.svg'))

类似于这样来设置新图标就可以了。

9. timer

参考: https://www.cnblogs.com/liming19680104/p/10663968.html https://www.jianshu.com/p/74ea98e77114

参考书目: 《QmlBook》In Chinese https://cwc1987.gitbooks.io/qmlbook-in-chinese/content/ QmlBook http://qmlbook.github.io/index.html PyQt5 基本教學 (1) 安裝 PyQt5,印出 Hello World! https://clay-atlas.com/blog/2019/08/26/python-chinese-pyqt5-tutorial-install/

X86 直接安装

sudo apt install python3-pyqt5

或者

python3 -m pip install --upgrade pip
pip3 install pyqt5==5.14.2 --user

pyqt5 最好和 qt5 版本对应。 参考: https://stackoverflow.com/questions/59711301/install-pyqt5-5-14-1-on-linux

ARM 源码安装

安装包见附件

安装必要的开发版本软件

sudo dnf install python3-devel
sudo dnf install qt5-devel

安装 sip

tar zxvf sip-4.19.8.tar.gz
cd sip-4.19.8
python3 configure.py
make
sudo make install

安装 pyQt5

tar zxvf PyQt5_gpl-5.10.1.tar.gz
cd PyQt5_gpl-5.10.1
python3 configure.py --qmake /usr/bin/qmake-qt5
make
sudo make install

为了方便后续安装,可以把编译好的文件进行打包,然后写一个脚本用来安装。

#!/usr/bin/bash

SIP=sip-4.19.8
PYQT=PyQt5_gpl-5.10.1

rm -rf ~/${SIP}
rm -rf ~/${PYQT}

tar xvfz ./${SIP}_build.tar.gz -C ~/
tar xvfz ./${PYQT}_build.tar.gz -C ~/

cd ~/${SIP}
sudo make install

cd ~/${PYQT}
sudo make install

rm -rf ~/${SIP}
rm -rf ~/${PYQT}

echo "install done."

附件

附件中压缩包内是编译好的 rk3399 的二进制,解压出来的是 编译好的 rk3228 的二进制。 附件pyqt5_install.tar.gz

尝试在 3399 上面安装 pyside2 ,结果碰到很多问题。

  1. 需要 qt5.12
  2. 需要 clang

全部需求如下:

General Requirements¶

    Python: 3.5+ and 2.7

    Qt: 5.12+ is recommended

    libclang: The libclang library, recommended: version 10 for PySide2 5.15. Prebuilt versions of it can be downloaded here.

    CMake: 3.1+ is needed.

尝试使用 qt5.10 编译 pyside2

结果发现 pyside2 里面没有 5.10 的分支,而且还要先编译 shiboken ,然后在编译 pyside2。放弃。 https://github.com/pyside/pyside2-setup https://wiki.qt.io/Qt_for_Python/GettingStarted

qt5.12

参考下面这个网页来编译 https://blog.csdn.net/qqwangfan/article/details/84964856

clang 二进制版本

https://releases.llvm.org/download.html#10.0.1 从上面下载 aarch64 版本,结果运行起来找不到 tinfo 的库文件。 放弃。 有说法是可以吧 ncurse 的库链接过去,不过没有尝试。

clang 源码版本

http://clang.llvm.org/get_started.html 按照上面的步骤来,但是要注意默认的是 debug 模式,编译出来空间不够,需要设置为 release 模式,编译出来就只有 1.7 G 左右了。当时从 github 上面指定下载 10.x 的最后一次提交。 具体配置可以参考: https://llvm.org/docs/CMake.html 参考: https://blog.csdn.net/petersmart123/article/details/78418765

1. 目录

这个是自动生成的,只要在目录的地方添加 [TOC],就会自动生成目录

2. 标题锚点

这个是默认支持的,只要在想要跳转的地方这样写:

[名称](#id)

其中的“名称”可以随便填写,“id”需要填写跳转到的标题的内容。

3. 自定义锚点,比如一个图表之类的。

现在图表这个地方创建锚点:

<span id = "jump">跳转到的位置</span>

然后再需要跳转的地方这样写:

[说明文字](#jump)

说明文字也可以随便填写,只要后面这个 id 能够和 锚点那地方对应上就可以。

参考: https://blog.csdn.net/tearsky253/article/details/78968221#%E5%89%8D%E8%A8%80 https://blog.csdn.net/qq_33530388/article/details/59058061

4. 强制分页符必须使用 html 代码,在需要分页的地方直接插入这个。

<div STYLE="page-break-after: always;"></div>

参考: https://blog.csdn.net/qq_38228254/article/details/90814620

5. 表格使用 | 来实现:

默认标题栏居中,内容靠左

:-  居左
-:  居右
:-: 居中

基本格式如下, - 至少有一个

| 表头 | 表头 | 表头 |
|:-- | :-: | --:|
|居左 | 居中 | 居右|

表格内换行在需要换行的地方使用


<br>
``` 来实现。

参考: http://www.mabiji.com/markdown/markdownbiaoge.html
https://blog.csdn.net/microcosmv/article/details/51868178