控件基本用法
button
单击普通按钮
button可以说是Qt中与用户交互最基本的控件,最简单的就是单击:
#初始化一个button控件
self.button_inputData = QtWidgets.QPushButton(self.widget)
#设置按钮上文本字体
font = QtGui.QFont()
font.setPointSize(20)
font.setBold(False)
font.setWeight(50)
self.button_inputData.setFont(font)
#设置控件名
self.button_inputData.setObjectName("button_inputData")
#设置按钮上显示的文本
self.button_inputData.setText('这是button显示的内容')
#设置信号-槽的连接,当用户点击该按钮后调用槽函数,参数为函数名
self.button_inputData.clicked.connect(self.button_inputData_clicked_Event)
保持状态的按钮
QToolButton类的按钮是专门为设计工具栏按钮提供的类,可以设置成单击第一次时按钮按下,触发clicked信号,并保持按下状态,直到用户再次点击此按钮,触发clicked信号,并弹起按钮,在程序运行期间任何时候都可检测按钮的“按下/弹起”状态。
设置setCheckable(True)和setAutoExclusive(True)后按钮可保持按下状态,且状态可查询:
self.button.setCheckable(True)
self.button.setAutoExclusive(True)
查询按钮是按下还是弹起的方法是:
self.button_openCamera.isChecked()
按钮按下返回值是True,按钮弹起返回值是False。
应用代码如下:
#QToolButton的初始化设置
self.button_openCamera = QtWidgets.QToolButton(win_recogFaceInVideo)
self.button_openCamera.setGeometry(QtCore.QRect(695, 15, 114, 32))
font = QtGui.QFont()
font.setPointSize(13)
self.button_openCamera.setFont(font)
self.button_openCamera.setCheckable(True)
self.button_openCamera.setAutoExclusive(True)
self.button_openCamera.setPopupMode(QtWidgets.QToolButton.InstantPopup)
self.button_openCamera.setObjectName("button_openCamera")
#设置setCheckable(True)和setAutoExclusive(True)后按钮可保持按下状态,且状态可查询
self.button_openCamera.setCheckable(True)
self.button_openCamera.setAutoExclusive(True)
#设置单击信号的槽函数
self.button_openCamera.clicked.connect(self.recog_in_camera)
#clicked槽函数中可以获取按钮“按下/弹起”的状态
def recog_in_camera(self):
#如果按钮是按下状态,则执行下面的操作
if self.button_openCamera.isChecked():
#更改此按钮button_openCamera的文本信息
self.button_openCamera.setText('关闭摄像头')
#设置另一个按钮button_openVideoFile不可操作
self.button_openVideoFile.setEnabled(False)
else:
#若按钮是弹起状态,则更改此按钮的文本信息
self.button_openCamera.setText('打开摄像头')
label
label显示文字
label显示文字是空间最基本的用法了,如下:
#初始化一个label控件,参数是父类,也就是承载这个控件的窗口win_recogFaceInVideo
self.label = QtWidgets.QLabel(win_recogFaceInVideo)
#设置控件大小和位置:宽20,高65,左上角坐标(781,406)
self.label.setGeometry(QtCore.QRect(20, 65, 781, 406))
#设置文本字体信息
font = QtGui.QFont()
font.setPointSize(30)
font.setBold(False)
font.setWeight(50)
font.setKerning(True)
self.label.setFont(font)
self.label.setTextFormat(QtCore.Qt.RichText)
#缩放对齐:不缩放、居中对齐
self.label.setScaledContents(False)
self.label.setAlignment(QtCore.Qt.AlignCenter)
#控件名
self.label.setObjectName("label")
#文本内容
self.label.setText('这是label显示的内容')
label显示图片
先给出个示例,实现在label控件中按原比例居中显示图片文件。
代码如下:
def show_img_in_lable_center( label, fname):
#label表示要用来显示图片的那个标签~
#fname表示事先获取到的要打开的图片文件名(含路径),可用QtWidgets.QFileDialog.getOpenFileName()获取哈~
pix_map = QPixmap(fname)
img_w = pix_map.width()
img_h = pix_map.height()
lab_w = label.width()
lab_h = label.height()
if (img_w > lab_w) | (img_h > lab_h):
#若图片宽高大于label宽高,则在label居中显示按图片原始比例缩放后的图片
w_rate = float(img_w) / float(lab_w)
h_rate = float(img_h) / float(lab_h)
if w_rate >= h_rate:
w = lab_w
h = int(img_h / w_rate)
else:
w = int(img_w / h_rate)
h = lab_h
else:
#若图片宽高都小于label宽高,则按图片原始大小显示
w = img_w
h = img_h
label.setPixmap(pix_map.scaled(w, h))
label显示视频
label显示视频的问题实际就是label定时显示图片,只需要引入一个定时和加入截取视频画面的过程。
网上找到的C++的代码:
VideoCapture capture;//声明视频读入类
capture.open(0);//从摄像头读入视频 0表示从摄像头读入
if (!capture.isOpened())//先判断是否打开摄像头
{
cout<<"can not open";
c