RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1539000
Accepted
bluesky
bluesky
Asked:2023-09-04 07:14:15 +0000 UTC2023-09-04 07:14:15 +0000 UTC 2023-09-04 07:14:15 +0000 UTC

在 PyQt5 中显示带布局和不带布局的小部件

  • 772

在一个窗口的“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())
python
  • 1 1 个回答
  • 27 Views

1 个回答

  • Voted
  1. Best Answer
    S. Nick
    2023-09-06T01:11:15Z2023-09-06T01:11:15Z
    1. 没有父级的小部件是一个窗口。
      因此,我们想要在主窗口中显示的所有内容都必须有一个父级,即我们将在其上显示它的小部件。

    2. 小部件的放置也是一个单独的大主题。
      我不推荐绝对定位,因为我不认为有必要而且不实用。我建议您彻底研究布局管理
      主题

    3. 你还没有展示出你得到的图像和你想要得到的图像。
      我看到你的任务是这样的:


    import sys 
    import numpy as np
    import random
    from PyQt5 import QtCore, QtWidgets, QtGui
    from PyQt5.Qt import *    
    from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
    from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar
    from matplotlib.figure import Figure
    
    
    class MyWidget(QWidget):
        def __init__(self, parent=None):
            super(QWidget, self).__init__(parent) 
            
            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()
    
            self.figure = Figure()                     
            self.canvas = FigureCanvas(self.figure)
            self.ax = self.figure.add_subplot(111)
            self.ax.set(xlabel='time (s)', ylabel='voltage (mV)',
                   title='About as simple ...')
            self.ax.grid()
    
            self.frame_right = QFrame()
            self.frame_right.setStyleSheet("background-color: #F4A460;")
            layout_frame_right = QGridLayout(self.frame_right)
    
            column = 2 
            many_button = 7
            for step in range(many_button):
                btn = QPushButton(f'btn{step+1}')
                btn.setStyleSheet("""
                    background-color: rgb(0, 0, 0);
                    color: rgb(85, 255, 127);
                    font-size: 11px;
                """)            
                row = step // column
                col = step % column
                btn.clicked.connect(lambda ch, b=btn, r=row, c=col: 
                    print(f'{b.text()}, [{r}, {c}])'))        
                layout_frame_right.addWidget(btn, row, col)  
            
    
            self.tableWidget = QTableWidget(5, 2)
            
            layout = QGridLayout(self)
            layout.setContentsMargins(0, 0, 0, 0)
            layout.addWidget(self.viewfinder, 0, 0)
            layout.addWidget(self.canvas, 0, 1)
            layout.addWidget(self.frame_right, 0, 2, 2, 1)
            layout.addWidget(self.tableWidget, 1, 0, 1, 2)
            layout.setRowStretch(0, 3)
            layout.setRowStretch(1, 2)
            layout.setColumnStretch(0, 4)
            layout.setColumnStretch(1, 4) 
            layout.setColumnStretch(2, 2) 
            
        def keyPressEvent(self, event):
            key = event.key()
            if key in (Qt.Key_Enter, Qt.Key_Return):
                self.update()  
            else:
                super().keyPressEvent(event)
            
    
    class MainWindow(QMainWindow):        
        def __init__(self, *args, **kwargs):
            super(MainWindow, self).__init__(*args, **kwargs)            
            self.central_widget = QWidget()
            self.central_widget.setObjectName("central_widget")  
            self.setCentralWidget(self.central_widget)
    
            self.qtabwidget = QTabWidget(self.central_widget)  
            self.qtabwidget.setObjectName("qtabwidget")
    
            self.tab_1 = MyWidget(self)
            self.tab_1.setObjectName("tab_1")
            self.qtabwidget.addTab(self.tab_1, "Tab 1")
            
            self.tab_2 = QtWidgets.QFrame()
            self.tab_2.setObjectName("tab_2")
            self.qtabwidget.addTab(self.tab_2, "Tab 2") 
         
            self.tab_3 = QtWidgets.QLabel(f'<center>Hello Tab3</center>')
            self.tab_3.setObjectName("tab_3")
            self.qtabwidget.addTab(self.tab_3, "Tab 3")   
    
            self.frame_bottom = QFrame()
            self.frame_bottom.setStyleSheet("background-color: #D2691E;")
            layout = QVBoxLayout(self.frame_bottom)
            layout.addWidget(QLabel(f'<center>Frame_Bottom</center>'))
            self.frame_right = QFrame()
            self.frame_right.setStyleSheet("background-color: #B8860B;")
            layout = QVBoxLayout(self.frame_right)
            layout.addWidget(QLabel(f'<center>Frame_Right</center>'))
    
            self.layout = QGridLayout(self.central_widget)
            self.layout.addWidget(self.qtabwidget)
            self.layout.addWidget(self.frame_right, 0, 1, 2, 1)
            self.layout.addWidget(self.frame_bottom, 1, 0, 1, 1)
            self.layout.setRowStretch(0, 5)
            self.layout.setRowStretch(1, 2)
            self.layout.setColumnStretch(0, 7)
            self.layout.setColumnStretch(1, 2)
    
    
    Stylesheet = '''
    #central_widget {
        background-color: #008080;
    }
    #qtabwidget {
        font-size: 15px; 
    }
    #qtabwidget::pane {
        border: 1px solid #008080;
    }
    QTabBar::tab {
        background: #F4A460;
        padding: 3px 7px;
    }
    QTabBar::tab:hover {
        background: #FF7F50;
    }
    QTabBar::tab:selected {
        background: #FFFF00;
        border-bottom: 2px solid #F00;
    }
    QTabBar::tab:!selected {
        border-bottom: 2px solid transparent;
    }
    #tab_1 {
        background-color: #FFFAF0;
    }
    #tab_2 {
        background-color: #800000;
    }
    #tab_3 {
        font-size: 25px; 
        background-color: #FFFF00;
        color: #FF00FF;
    }
    '''
    
            
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        app.setStyleSheet(Stylesheet) 
        app.setFont(QtGui.QFont("Times", 12, QtGui.QFont.Bold))
        app.setApplicationName("WebCam")
        window = MainWindow()
        window.resize(970, 560)
        window.show()
        sys.exit(app.exec())
    

    在此输入图像描述

    • 1

相关问题

  • 是否可以以某种方式自定义 QTabWidget?

  • telebot.anihelper.ApiException 错误

  • Python。检查一个数字是否是 3 的幂。输出 无

  • 解析多个响应

  • 交换两个数组的元素,以便它们的新内容也反转

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5