在一个窗口的“tab1”选项卡上,应显示来自网络摄像头的视频图像和图表,按下按钮时会更新该图表。窗口的大小、小部件以及窗口上的位置必须是固定的。我设法将图形和视频图像放置在“QHBoxLayout()”上。但是,当固定放置在“MyWidget”类中的“tab1”选项卡上(设置小部件的位置和大小时),而不是“MainWindow”上时,它们不会显示。我为什么要这样做 - 最后,我的图表应该从表格中获取值,并在我单击表格单元格时进行更新,并且这已经在“MyWidget”类中实现了。 1 个带有“QHBoxLayout()”的布局选项(工作):
import numpy as np
import sys
from PyQt5.Qt import *
import random
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
import matplotlib.pyplot as plt
class MyWidget(QWidget):
def __init__(self, parent):
global kolichestvo_tochek
global y
super(QWidget, self).__init__(parent)
self.tabs = QTabWidget()
self.tab1 = QWidget()
self.layout_1 = QHBoxLayout()
self.tab1.setLayout(self.layout_1)
self.tabs.addTab(self.tab1, 'tab1')
# График
self.figure = Figure()
self.canvas = FigureCanvas(self.figure)
self.ax = self.figure.add_subplot(111)
self.layout_1.addWidget(self.canvas)
self.update()
self.layout = QVBoxLayout(self)
self.layout.addWidget(self.tabs)
self.sc = MplCanvas(self, width=5, height=4, dpi=100)
# Камера
self.viewfinder = QCameraViewfinder()
self.cameraInfo = QCameraInfo.defaultCamera()
self.camera = QCamera(self.cameraInfo)
self.camera.setViewfinder(self.viewfinder)
self.layout_1.insertWidget(0, self.viewfinder)
if self.camera.status() != QCamera.UnavailableStatus:
self.camera.start()
# Реакция на нажатие Enter на нампаде! клавиатуры
def keyPressEvent(self, e):
k = e.key()
if k == 16777221:
super().keyPressEvent(e)
self.update()
def update(self):
global y
self.ax.clear()
x = np.arange(1, 6)
y = np.random.randint(1, 10, size=5)
self.ax.plot(x, y)
self.canvas.draw()
class MainWindow(QMainWindow):
def __init__(self, *args, **kwargs):
super(MainWindow, self).__init__(*args, **kwargs)
self.resize(1500, 470)
self.widget1 = MyWidget(self)
self.central_widget = QWidget()
self.setCentralWidget(self.central_widget)
main_layout = QVBoxLayout(self.central_widget)
main_layout.addWidget(self.widget1)
class MplCanvas(FigureCanvas):
def __init__(self, parent=None, width=5, height=4, dpi=100):
fig = Figure(figsize=(width, height), dpi=dpi)
self.axes = fig.add_subplot(111)
super(MplCanvas, self).__init__(fig)
if __name__ == '__main__':
app = QApplication(sys.argv)
app.setApplicationName("WebCam")
window = MainWindow()
window.show()
sys.exit(app.exec())
2 没有“布局”的选项(不起作用):
import numpy as np
import sys
from PyQt5.Qt import *
import random
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
import matplotlib.pyplot as plt
class MyWidget(QWidget):
def __init__(self, parent):
global kolichestvo_tochek
global y
super(QWidget, self).__init__(parent)
self.tabs = QTabWidget()
self.tab1 = QWidget(self)
# График
self.figure = Figure()
self.canvas = FigureCanvas(self.figure)
self.ax = self.figure.add_subplot(111)
self.update()
self.layout = QVBoxLayout(self)
self.sc = MplCanvas(self, width=5, height=4, dpi=100)
# Камера
self.viewfinder = QCameraViewfinder()
self.cameraInfo = QCameraInfo.defaultCamera()
self.camera = QCamera(self.cameraInfo)
self.camera.setViewfinder(self.viewfinder)
if self.camera.status() != QCamera.UnavailableStatus:
self.camera.start()
# Реакция на нажатие Enter на нампаде! клавиатуры
def keyPressEvent(self, e):
k = e.key()
if k == 16777221:
super().keyPressEvent(e)
self.update()
def update(self):
global y
self.ax.clear()
x = np.arange(1, 6)
y = np.random.randint(1, 10, size=5)
self.ax.plot(x, y)
self.canvas.draw()
class MainWindow(QMainWindow):
def __init__(self, *args, **kwargs):
super(MainWindow, self).__init__(*args, **kwargs)
self.resize(1500, 470)
self.widget1 = MyWidget(self)
self.central_widget = QWidget()
self.setCentralWidget(self.central_widget)
central_widget = QTabWidget()
central_widget.addTab(self.widget1, "tab1")
self.setCentralWidget(central_widget)
class MplCanvas(FigureCanvas):
def __init__(self, parent=None, width=5, height=4, dpi=100):
fig = Figure(figsize=(width, height), dpi=dpi)
self.axes = fig.add_subplot(111)
super(MplCanvas, self).__init__(fig)
if __name__ == '__main__':
app = QApplication(sys.argv)
app.setApplicationName("WebCam")
window = MainWindow()
window.show()
sys.exit(app.exec())
没有父级的小部件是一个窗口。
因此,我们想要在主窗口中显示的所有内容都必须有一个父级,即我们将在其上显示它的小部件。
小部件的放置也是一个单独的大主题。
我不推荐绝对定位,因为我不认为有必要而且不实用。我建议您彻底研究布局管理
主题
你还没有展示出你得到的图像和你想要得到的图像。
我看到你的任务是这样的: