pyqt5学习笔记

    科技2022-07-10  219

    基本设置

    风格设置

    字体 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,“注意”,“账号,密码不能为空!”)

    表格控件

    数据插入到表格中,并设置颜色 data = QTableWidgetItem(str(temp_data)) # 转换后可插入表格 data.setTextAlignment(Qt.AlignCenter) data.setBackground(QColor(“red”)) self.tableView.setItem(i, j, data)添加表格控件 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

    逻辑关系:

    所有的窗口都生成的是一个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)
    Processed: 0.087, SQL: 8