Размещение виджета в окне PyQt5

Рейтинг: 1Ответов: 1Опубликовано: 20.08.2023

На окне должны располагаться две вкладки.
На каждой вкладке кнопка.
На первой вкладке возле кнопки должно отображаться видео с вебкамеры,
но окно с видео появляется на отдельном окне и видео не транслируется.

from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtMultimedia import *
from PyQt5.QtMultimediaWidgets import *

import os
import sys

class MainWindow(QMainWindow):
    def __init__(self, *args, **kwargs):
        super(MainWindow, self).__init__(*args, **kwargs)

        self.setGeometry(100, 100, 1500, 700)
        self.available_cameras = QCameraInfo.availableCameras()
        if not self.available_cameras:            
            sys.exit()
        self.status = QStatusBar()
        self.setStatusBar(self.status)            
        self.viewfinder = QCameraViewfinder()
        self.viewfinder.show()

        self.online_webcams = QCameraInfo.availableCameras()
        if not self.online_webcams:
            pass
        self.exist = QCameraViewfinder()
        self.exist.show()
        self.setCentralWidget(self.exist)
    
        # Вебкамера по умолчанию
        Camera.get_webcam(self, i=0)        

        # Размещаем виджеты
        self.widget1  = MyTableWidget(self)
        self.widget2  = Camera(self)
    
        main_layout = QVBoxLayout()
        main_layout.addWidget(self.widget1)
        main_layout.addWidget(self.widget2)        
        central_widget = QWidget()
        central_widget.setLayout(main_layout)
        self.setCentralWidget(central_widget)
        self.show()

class Camera(QWidget):
    def __init__(self, parent):
        super(QWidget, self).__init__(parent)
    
    def get_webcam(self, i):
        self.my_webcam = QCamera(self.online_webcams[i])
        self.my_webcam.setViewfinder(self.exist)
        self.my_webcam.setCaptureMode(QCamera.CaptureStillImage)
        self.my_webcam.error.connect(lambda: self.alert(self.my_webcam.errorString()))
        self.my_webcam.start()

        def alert(self, s):
            """
            Ошибки
            """
            err = QErrorMessage(self)
            err.showMessage(s)

class MyTableWidget(QWidget):
    def __init__(self, parent):

        super(QWidget, self).__init__(parent)
        self.layout_1 = QVBoxLayout(self)
        self.layout_2 = QVBoxLayout(self)
    
        # Инициализируем экран вкладок
        self.tabs = QTabWidget()
        self.tab1 = QWidget()
        self.tab2 = QWidget()
        self.tabs.resize(300,200)
    
        # Добавляем вкладки
        self.tabs.addTab(self.tab1,"Вкладка 1")
        self.tabs.addTab(self.tab2,"Вкладка 2")
    
        # Создаем вкладки
        self.tab1.layout_1 = QVBoxLayout(self)
        self.tab2.layout_2 = QVBoxLayout(self)

        # Создаем кнопки
        self.pushButton1 = QPushButton("Кнопка 1")
        self.pushButton2 = QPushButton("Кнопка 2")
    
        # Действие при нажатии на кнопку
        self.pushButton1.clicked.connect(self.on_click_1)
        self.pushButton2.clicked.connect(self.on_click_2)

        # Добавляем кнопку на вкладку № 1
        self.tab1.layout_1.addWidget(self.pushButton1)        
        self.tab1.setLayout(self.tab1.layout_1)

        # Добавляем кнопку на вкладку № 2
        self.tab2.layout_2.addWidget(self.pushButton2)
        self.tab2.setLayout(self.tab2.layout_2)
    
        # Добавляем вкладки
        self.layout_1.addWidget(self.tabs)
        self.setLayout(self.layout_1)

        self.layout_2.addWidget(self.tabs)
        self.setLayout(self.layout_2)
    
        # Функция по нажатию кнопки
        def on_click_1(self):
            print("Нажата кнопка 1")

        def on_click_2(self):
            print("Нажата кнопка 2")

if __name__ == '__main__':
    app = QApplication(sys.argv)
    app.setApplicationName("WebCam")
    window = MainWindow()
    app.exec_()

Ответы

▲ 2Принят

Я не уверен что правильно понял вас, но мой вариант может выглядеть так:
(реализовано только для "Вкладка 1")

import sys
from PyQt5.Qt import *
from PyQt5.QtMultimedia import *
from PyQt5.QtMultimediaWidgets import *


class MyTableWidget(QWidget):
    def __init__(self, parent):
        super(QWidget, self).__init__(parent)
#        self.layout_1 = QVBoxLayout()                                # - self
#        self.layout_2 = QVBoxLayout()                                # - self
    
        # Инициализируем экран вкладок
        self.tabs = QTabWidget()
        self.tab1 = QWidget()
        self.tab1.layout_1 = QVBoxLayout(self.tab1)                   # - self
        self.tab2 = QWidget()          # ^^^^^^^^^ <--------------------------
        self.tab2.layout_2 = QVBoxLayout(self.tab2)                   # - self
                                       # ^^^^^^^^^ <--------------------------
#        self.tabs.resize(300,200)
    
        # Добавляем вкладки
        self.tabs.addTab(self.tab1, "Вкладка 1")
        self.tabs.addTab(self.tab2, "Вкладка 2")

        # Создаем кнопки
        self.pushButton1 = QPushButton("Кнопка 1")
        self.pushButton2 = QPushButton("Кнопка 2")

        # Добавляем кнопку на вкладку № 1
        self.tab1.layout_1.addWidget(self.pushButton1)        
        # Добавляем кнопку на вкладку № 2
        self.tab2.layout_2.addWidget(self.pushButton2)
    
        self.layout = QVBoxLayout(self)                              # !!! +++  
        self.layout.addWidget(self.tabs)                             # !!! +++
            
            
class MainWindow(QMainWindow):
    def __init__(self, *args, **kwargs):
        super(MainWindow, self).__init__(*args, **kwargs)
#        self.setGeometry(100, 100, 1500, 700)
        self.resize(500, 470)
        self.status = QStatusBar()
        self.setStatusBar(self.status)

        self.viewfinder = QCameraViewfinder()
        self.cameraInfo = QCameraInfo.defaultCamera()

        self.camera = QCamera(self.cameraInfo)
        self.camera.setViewfinder(self.viewfinder)        
      

        # Размещаем виджеты
        self.widget1  = MyTableWidget(self)
        self.widget1.pushButton1.clicked.connect(self.on_click_btn_1)       # +
        self.widget1.pushButton2.clicked.connect(self.on_click_btn_2)       # + 
        
        self.central_widget = QWidget()
        self.setCentralWidget(self.central_widget)        
    
        main_layout = QVBoxLayout(self.central_widget)
        main_layout.addWidget(self.widget1)
        
        self.widget1.tab1.layout_1.insertWidget(0, self.viewfinder)          # +++

    def on_click_btn_1(self):                                                # +++
#        print("Нажата кнопка 1.")
        if self.camera.status() == 8:
            self.camera.stop()  
            self.status.showMessage("Camera stop", 5000)
        elif self.camera.status() != QCamera.UnavailableStatus:
            self.camera.start()  
            self.status.showMessage("Camera start", 5000)

    def on_click_btn_2(self):                                                # +++
        print("Нажата кнопка 2")


if __name__ == '__main__':
    app = QApplication(sys.argv)
    app.setApplicationName("WebCam")
    window = MainWindow()
    window.show()
    sys.exit(app.exec())

введите сюда описание изображения

введите сюда описание изображения


Update:

Спасибо, но видео с веб-камеры должно транслироваться сразу при включении программы. Кнопки не должны влиять на вкл. или выкл. трансляции

import sys
from PyQt5.Qt import *
from PyQt5.QtMultimedia import *
from PyQt5.QtMultimediaWidgets import *


class MyTableWidget(QWidget):
    def __init__(self, parent):
        super(QWidget, self).__init__(parent)
#        self.layout_1 = QVBoxLayout()                                # - self
#        self.layout_2 = QVBoxLayout()                                # - self
    
        # Инициализируем экран вкладок
        self.tabs = QTabWidget()
        self.tab1 = QWidget()
        self.tab1.layout_1 = QVBoxLayout(self.tab1)                   # - self
        self.tab2 = QWidget()          # ^^^^^^^^^ <--------------------------
        self.tab2.layout_2 = QVBoxLayout(self.tab2)                   # - self
                                       # ^^^^^^^^^ <--------------------------
#        self.tabs.resize(300,200)
    
        # Добавляем вкладки
        self.tabs.addTab(self.tab1, "Вкладка 1")
        self.tabs.addTab(self.tab2, "Вкладка 2")

        # Создаем кнопки
        self.pushButton1 = QPushButton("Кнопка 1")
        self.pushButton2 = QPushButton("Кнопка 2")

        # Добавляем кнопку на вкладку № 1
        self.tab1.layout_1.addWidget(self.pushButton1)        
        # Добавляем кнопку на вкладку № 2
        self.tab2.layout_2.addWidget(self.pushButton2)
    
        self.layout = QVBoxLayout(self)                              # !!! +++  
        self.layout.addWidget(self.tabs)                             # !!! +++
            
            
class MainWindow(QMainWindow):
    def __init__(self, *args, **kwargs):
        super(MainWindow, self).__init__(*args, **kwargs)
#        self.setGeometry(100, 100, 1500, 700)
        self.resize(500, 470)
        self.status = QStatusBar()
        self.setStatusBar(self.status)

        self.viewfinder = QCameraViewfinder()
        self.cameraInfo = QCameraInfo.defaultCamera()

        self.camera = QCamera(self.cameraInfo)
        self.camera.setViewfinder(self.viewfinder)        
      

        # Размещаем виджеты
        self.widget1  = MyTableWidget(self)
        self.widget1.pushButton1.clicked.connect(self.on_click_btn_1)       # +
        self.widget1.pushButton2.clicked.connect(self.on_click_btn_2)       # + 
        
        self.central_widget = QWidget()
        self.setCentralWidget(self.central_widget)        
    
        main_layout = QVBoxLayout(self.central_widget)
        main_layout.addWidget(self.widget1)
        
        self.widget1.tab1.layout_1.insertWidget(0, self.viewfinder)          # +++

# !!! +++       
        if self.camera.status() != QCamera.UnavailableStatus:
            self.camera.start() 
# !!! +++

    def on_click_btn_1(self):                                                # +++
        print("Нажата кнопка 1.")

    def on_click_btn_2(self):                                                # +++
        print("Нажата кнопка 2")


if __name__ == '__main__':
    app = QApplication(sys.argv)
    app.setApplicationName("WebCam")
    window = MainWindow()
    window.show()
    sys.exit(app.exec())