pyqt5学习笔记

基本设置

风格设置

字体 font: 15pt ;color:white;background-color:transparent;border:outset;

设置背景透明 background-color: Transparent;

Designer设计风格:
QWidget{
border-image:url(:/background/background.jpg)
}
QTextBrowser {
border-image:url();
background-color:rgba(255,255,255,180)
}
QLabel {
border-image:url();
background-color:rgba(255,255,255,180)
}
QLineEdit {
border-image:url();
background-color:rgba(255,255,255,180)
}
QPushButton {
border-image:url();
background-color:rgba(255,255,255,180)
}

UI_object类中的一些设置

设置字体 font = QtGui.QFont()
font.setFamily(“Songti TC”)
font.setPointSize(16)
font.setBold(True)
font.setWeight(75)

类中的函数 def setupUi(self, BatchWins):#用于添加控件
def retranslateUi(self, BatchWins):#放的是一些控件的具体词

功能类中的一些设置:

继承QWidget类 初始化创建一个Ui_object对象
self.ui = Ui_BatchWins()#
self.ui.setupUi(self)

该类作用 重新设置Ui的风格、处理控件的事件
表格控件的具体属性 self.tableView.setColumnCount(5)
self.tableView.setHorizontalHeaderLabels([‘序号’, ‘文件名’, ‘译制状态’, ‘操作’, ‘视频地址’])
self.tableView.setColumnHidden(4, True)
设置字体
font = self.tableView.horizontalHeader().font()
font.setBold(True)
self.tableView.horizontalHeader().setFont(font)

Pyqt

按钮事件触发:

self.pushButton_enter.clicked.connect(self.on_pushButton_enter_clicked)
按钮传参数
但是如果我们需要传参数这个方法就行不通了,需要采用lambda表达式才能传递参数例如下面这种写法
self.ui.pushButton.clicked.connect(lambda: self.start_end_trans(self.ui.pushButton)) # 译制按钮
退出界面:
QCoreApplication.instance().quit
获取界面文本:
self.account.text()
提示框:
QMessageBox.about(self,“注意”,“账号,密码不能为空!”)

表格控件

  1. 数据插入到表格中,并设置颜色
    data = QTableWidgetItem(str(temp_data)) # 转换后可插入表格
    data.setTextAlignment(Qt.AlignCenter)
    data.setBackground(QColor(“red”))
    self.tableView.setItem(i, j, data)
  2. 添加表格控件 self.tableWidget = QtWidgets.QTableWidget(BatchWins)

将控件添加到窗口中 self.gridLayout_4.addWidget(self.tableWidget, 0, 0, 1, 1)


3. 表格风格设置
self.tableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
1.QHeaderView.Stretch:列宽自动分配
2.QHeaderView.Interactive:手动调整
3.QHeaderView.Fixed:固定值
4.自定义列宽:
self.tableWidget.setColumnWidth(0, 40)
self.tableWidget.setColumnWidth(1, 200)
self.tableWidget.setColumnWidth(2, 200)

顺序self.tableView.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)所有列自动拉伸,充满界面
self.ui.tableWidget.setRowCount(len(datas))#设置表格行数
self.tableView.horizontalHeader().setSectionResizeMode(0, QHeaderView.ResizeToContents)第一列默认长度
表格设置 self.tableView.setSelectionMode(QAbstractItemView.SingleSelection)设置只能选中一行
self.tableView.setEditTriggers(QTableView.NoEditTriggers)不可编辑
self.tableView.setSelectionBehavior(QAbstractItemView.SelectRows)设置只有行选中
表格插入数据self.tableView.setItem(self.id, 1, name_item)status_item = QTableWidgetItem(‘尚未译制’)
行内边距hLayout.setContentsMargins(100, 2, 100, 2)左上右下
status_item.setTextAlignment(Qt.AlignCenter)对齐方式
垂直滚动条self.ui.tableView.verticalScrollBar().setCursor(Qt.PointingHandCursor)
self.ui.tableView.setFrameShape(QFrame.NoFrame)无边框
不可编辑表格self.ui.tableView.setItemDelegateForColumn(2, EmptyDelegate(self))
self.ui.tableView.setAlternatingRowColors(True)行交替颜色
单个单元格选中self.ui.tableWidget.horizontalHeader().setSelectionMode(QAbstractItemView.NoSelection)
某一列的长度self.tableView.setColumnWidth(6, self.tablewidth * 2.8)
无边框self.ui.tableWidget.setFrameShape(QFrame.NoFrame) # 无边框
行交替颜色self.ui.tableWidget.setAlternatingRowColors(True)

下拉框:

self.ui.comboBox.activated[str].connect(self.chooselanguage)
按钮文本选择:
self.ui.pushButton_3.text() == ‘播放’
ui.pushButton_3.setText(‘暂停’)
self.comboBox.setItemData(4, 0, Qt.UserRole - 1)#第四个属性不可选择
self.ui.comboBox_2.setEnabled(False)#下拉框设置不可用
comboBox.activated[str].connect(self.chooselanguage)#信号槽函数,信号为字符或者int

提示框:
QMessageBox.about(self,‘注意’,"请选择译制语言! ")

菜单框:

self.ui.menubar.triggered.connect(self.processtrigger)#菜单栏触发某个action的槽函数
Processtrigger函数:def processtrigger(self,action):#传入的信号为action
if action.text() == “单视频”:#根据菜单文本来判断点击的菜单

打开文件:

QFileDialog.getOpenFileName(self, “选取视频文件”, “./”,
‘Video Files(*.mp4 , *.mkv , *.wmv , *.avi)’)

播放窗口:

from PyQt5.QtMultimediaWidgets import QVideoWidget

self.videoplayer = QVideoWidget(self.VideoPlayerGroup)

self.player = QMediaPlayer(None, QMediaPlayer.VideoSurface)#播放器
self.player.setVideoOutput(self.ui.videoplayer)

窗口:

设置按钮大小固定:

窗口全屏:
desktop = QApplication.desktop()
rect = desktop.availableGeometry()
self.setGeometry(rect)
获取屏幕大小:
self.desktop = QApplication.desktop()
self.screenRect = self.desktop.screenGeometry()
height = self.screenRect.height()
width = self.screenRect.width()

调整框的大小

height, width = self.get_screenRect()
height = 0.9 * height
width = width
self.setGeometry(0, 0, width, height)#设置窗口大小,坐标0,0开始长宽
self.setMinimumSize(QSize(width, height))
self.setMaximumSize(QSize(width, height))

#按比例给每一个框分配大小小数为比例
self.ui.tabWidget.setMaximumSize(QSize(0.385 * width, 0.49 * height))
self.ui.tabWidget.setMinimumSize(QSize(0.385 * width, 0.49 * height))
self.ui.VideoPlayerGroup.setMaximumSize(QSize(0.592 * width, 0.757 * height))
self.ui.VideoPlayerGroup.setMinimumSize(QSize(0.592 * width, 0.757 * height))
self.ui.SubtitleInfoGroup.setMaximumSize(QSize(0.3875 * width, 0.39 * height))
self.ui.SubtitleInfoGroup.setMinimumSize(QSize(0.3875 * width, 0.39 * height))
self.ui.VideoSetGroup.setMaximumSize(QSize(0.38 * width, 0.45 * height))
self.ui.VideoSetGroup.setMinimumSize(QSize(0.38 * width, 0.45 * height))
self.ui.VideoSetGroup_2.setMaximumSize(QSize(0.38 * width, 0.45 * height))
self.ui.VideoSetGroup_2.setMinimumSize(QSize(0.38 * width, 0.45 * height))
self.ui.SubtitleProofGruop.setMaximumSize(QSize(0.592 * width, 0.147 * height))
self.ui.SubtitleProofGruop.setMinimumSize(QSize(0.592 * width, 0.147 * height))

Sql:

cursor.execute(“select * from user_info where user_name=” + “’”+user_name+"’ and password = ‘"+password+"’")<1
行数:
print(cursor.rowcount)
所有值:
cursor.fetchall()

连接数据库

SQLAlchemy

对象关系映射器提供了一种方法,用于将用户定义的Python类与数据库表相关联,并将这些类(对象)的实例与其对应表中的行相关联。它包括一个透明地同步对象及其相关行之间状态的所有变化的系统。
ORM 就是 Object Relational Mapper 的简写,就是关系对象映射器的意思。
原理大白话:
创建一个类,一个类对应了一个数据库中的一张表,类的数据属性对应了表中的字段名,这个类称为映射类。

连接数据库

from sqlalchemy import create_engine
engine = create_engine(“mysql+pymysql://root:root@222.197.219.6/sys?charset=utf8mb4”, max_overflow=5,
pool_recycle=60 * 120)

#创建连接数据库的引擎,session连接数据库需要
my_engine = create_engine(‘mysql+pymysql://root:123456@localhost/my_db’)
#创建一个配置过的Session类
Session = sessionmaker(bind=my_engine)
#实例化一个session
db_session = Session()
#使用session
myobject = MyObject(‘foo’, ‘bar’) db_session.add(myobject) db_session.commit()

更新操作

.update(字典类型)
def update_sub(self,video_id,subtitle_id,zh,xyz):
update_Data = {‘zh_new’:zh,‘xyz_new’:xyz}
datas = self.session.query(Subtitle_data).filter(and_(Subtitle_data.idvideo_id,Subtitle_data.subtitle_idsubtitle_id)).update(update_Data)
self.session.commit()
del删除的是变量,而不是数据。

插入数据:

.add(对象)
self.session.add(subinfo)
self.session.commit()
Eg:
session=DataBase()
new_user=Users(s_no=“02”,pwd=“123123”)
session.add(new_user)
session.commit()
session.close()

查询数据:

Filter_by=where
All=*
Datas=self.session.query(Subtitle_info).filter_by(create_user=self.user_name).filter(
or_(Subtitle_info.proof_status == ‘未校对’, Subtitle_info.proof_status == ‘校对中’)).order_by(Subtitle_info.create_time).all()

登录:datas = self.session.query(Users类).filter_by(user_name=user_name,password=password).all()
条件查询:
datas = self.session.query(Subtitle_info).filter_by(create_user=user_name).filter(or_(Subtitle_info.proof_status==‘未校对’, Subtitle_info.proof_status==‘校对中’)).order_by(
Subtitle_info.create_time).all()

批量插入:
session.bulk_insert_mappings(ModelClass, list(dict())):表类、插入数据
Session.flush()
Session.commit()
flush会把更改提交到数据库,commit会默认调用flush,然后标志这个事务的提交,也就是事务执行完毕。如果只调用flush,那么更新虽然可以被写入数据库,但是事务是不完整的,没有提交。由于事务隔离型的存在,可能其他的事务是无法看到这次更新操作的。只有调用了commit,才能被看成是事务完整的执行完毕。
把要插入的数据以字典的形式做成列表这种插入方法的效率非常高,而且接口操作非常方便

创建会话的对应数据库表的类

作用:以对象的方式和数据库进行交互。
class Users(Base):
# 表名
tablename = ‘user_info’
# 定义id,主键唯一,
user_id = Column(INT, primary_key=True)
user_name = Column(VARCHAR(45),unique=True)
password = Column(VARCHAR(45))
usergroup_id = Column(INT)
userrole_id = Column(INT)
def init(self,user_id,user_name,password,usergroup_id,userrole_id):
self.user_id = user_id
self.user_name = user_name
self.password = password
self.usergroup_id = usergroup_id
self.userrole_id = userrole_id

视频处理:
videoCap=cv2.VideoCapture(video_filename)
视频长度
Size:int(videoCap.get(cv2.CAP_PROP_FRAME_WIDTH)),
int(videoCap.get(cv2.CAP_PROP_FRAME_HEIGHT))
Fps:videoCap.get(cv2.CAP_PROP_FPS)
视频总帧数:totalFrameNumber = int(videoCap.get(cv2.CAP_PROP_FRAME_COUNT))

信号槽:

信号与槽
信号是一个载体,装着自定义类型的数据(例如下面的object),将数据传送到绑定(connect)的函数(连接槽)中(数据作为参数传入函数)
show_infoes_signal = pyqtSignal(list)#信号对象
self.show_infoes_signal.emit([movie_name, size, fps])
将信号连接到指定槽函数
self.signal1.connect(self.signalCall1)
原理:
定义一个信号,发射信号(对象,list,dict等)给指定的槽函数
Videotransthread类中:
end_signal = pyqtSignal(list)
self.end_signal.emit([result,original_path,trans_path])
Main.py中:
self.videotransthread.end_signal.connect(self.processEnd)
Def processEnd(self,sign):
Sign是一个list对象,可以用sign[0]表示result
对象中的信号槽连接槽函数,信号就是用来传值的

线程Qthread

1.用一个类继承QThread,然后重新改写虚函数run()当要开启新线程时,只需要实例该类,然后调用函数start(),就可以开启一条多线程
2.重写run()函数
鼠标事件
self.ui.tableView.currentCellChanged.connect(self.cellEntered)
def cellEntered(self, a, b):
if b == 1:
try :
DB = Mysql()
pic = DB.get_picpath(self.videoid,str(a+1))
del DB
except :
QMessageBox.about(self, ‘注意’, ‘连接数据库失败,请检查网络!’)
return

逻辑关系:

  1. 所有的窗口都生成的是一个Ui_object,功能处理类可以新创建一个py,继承于QWidget并且调用该Ui_object窗口,该类用于动态处理Ui_object中的控件的具体功能。
    def init(self, parent=None):
    super(User_info_view, self).init(parent)
    self.ui = Ui_user_info()
    self.ui.setupUi(self)
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值