Не получается подключить слайдер с регулировкой прозрачности отдельного окна
Есть плеер с отдельным окном для воспроизведения видео и потока с камеры.
Нужно добавить слайдер для регулировки прозрачности отдельного окна.
Video.py:
import sys
from ctypes import resize
from tkinter import *
import cv2
import numpy as np
import tkinter.ttk as ttk
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtMultimedia import *
from PyQt5.QtMultimediaWidgets import *
from MainWindow import Ui_MainWindow
def hhmmss(ms):
h, r = divmod(ms, 36000)
m, r = divmod(r, 60000)
s, _ = divmod(r, 1000)
return ("%d:%02d:%02d" % (h,m,s)) if h else ("%d:%02d" % (m,s))
class ViewerWindow(QMainWindow):
state = pyqtSignal(bool)
def closeEvent(self, e):
self.state.emit(False)
class PlaylistModel(QAbstractListModel):
def __init__(self, playlist, *args, **kwargs):
super(PlaylistModel, self).__init__(*args, **kwargs)
self.playlist = playlist
def data(self, index, role):
if role == Qt.DisplayRole:
media = self.playlist.media(index.row())
return media.canonicalUrl().fileName()
def rowCount(self, index):
return self.playlist.mediaCount()
class ThreadOpenCV(QThread):
changePixmap = pyqtSignal(QImage)
def __init__(self, parent=None):
super().__init__()
self.width = parent.width()
self.height = parent.height()
def run(self):
cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)
cap.set(cv2.CAP_PROP_FPS, 24)
while True:
ret, frame = cap.read()
if ret:
frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
frame = cv2.resize(frame, (1680, 480)) #Разреш камеры
frame_expanded = np.expand_dims(frame_rgb, axis=0)
rgbImage = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
h, w, ch = rgbImage.shape
bytesPerLine = ch * w
convertToQtFormat = QImage(
rgbImage.data, w, h, bytesPerLine, QImage.Format_RGB888)
# p = convertToQtFormat.scaled(1280, 960, Qt.KeepAspectRatio)
p = convertToQtFormat.scaled(self.width, self.height, Qt.KeepAspectRatio)
self.changePixmap.emit(p)
if cv2.waitKey(1) == ord('q'):
break
self.msleep(20)
cv2.destroyAllWindows()
class WidgetForCv2(QtWidgets.QMainWindow,):
def __init__(self):
super().__init__()
self.resize(1680, 340,)
self.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
self.centralWidget = QWidget()
self.setCentralWidget(self.centralWidget)
self.setWindowOpacity(0.6)
self.setWindowFlags(self.windowFlags() | Qt.WindowStaysOnTopHint)
self.label_video = QLabel(self, alignment = Qt.AlignCenter)
self.label_video.setMinimumSize(QSize(100, 100))
layout = QVBoxLayout(self.centralWidget)
layout.addWidget(self.label_video)
self.thread = ThreadOpenCV(self)
self.thread.changePixmap.connect(self.setImage)
def setImage(self, image):
self.label_video.setPixmap(QtGui.QPixmap.fromImage(image))
def resizeEvent(self, event):
self.thread.width = self.width()
self.thread.height = self.height()
class MainWindow(QMainWindow, Ui_MainWindow):
def __init__(self, *args, **kwargs):
super(MainWindow, self).__init__(*args, **kwargs)
self.setupUi(self)
self.player = QMediaPlayer()
self.player.error.connect(self.erroralert)
self.player.play()
# Настроить плейлист.
self.playlist = QMediaPlaylist()
self.player.setPlaylist(self.playlist)
# Добавить просмотрщик для воспроизведения видео, отдельное плавающее окно
self.viewer = ViewerWindow(self)
self.viewer.resize(1024, 768,)
self.viewer.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
self.viewer.setWindowFlags(self.viewer.windowFlags() | Qt.WindowStaysOnTopHint)
self.viewer.setWindowOpacity(0.6)
videoWidget = QVideoWidget()
self.viewer.setCentralWidget(videoWidget)
self.player.setVideoOutput(videoWidget)
self.playButton.pressed.connect(self.player.play)
self.stopButton.pressed.connect(self.player.stop)
self.viewButton.toggled.connect(self.toggle_viewer)
self.viewer.state.connect(self.viewButton.setChecked)
self.model = PlaylistModel(self.playlist)
self.playlistView.setModel(self.model)
self.playlist.currentIndexChanged.connect(self.playlist_position_changed)
selection_model = self.playlistView.selectionModel()
selection_model.selectionChanged.connect(self.playlist_selection_changed)
self.player.durationChanged.connect(self.update_duration)
self.player.positionChanged.connect(self.update_position)
self.timeSlider.valueChanged.connect(self.player.setPosition)
self.open_file_action.triggered.connect(self.open_file)
self.setAcceptDrops(True)
self.widgetForCv2 = WidgetForCv2()
def dragEnterEvent(self, e):
if e.mimeData().hasUrls():
e.acceptProposedAction()
def dropEvent(self, e):
for url in e.mimeData().urls():
self.playlist.addMedia(
QMediaContent(url)
)
self.model.layoutChanged.emit()
# Если не играет, ищу сначала из недавно добавленных + играть.
if self.player.state() != QMediaPlayer.PlayingState:
i = self.playlist.mediaCount() - len(e.mimeData().urls())
self.playlist.setCurrentIndex(i)
self.player.play()
def open_file(self):
path, _ = QFileDialog.getOpenFileName(
self,
"Open file",
"",
"mp4 Video (*.mp4);;mp3 Audio (*.mp3);;Movie files (*.mov);;avi Video (*.avi)")
if path:
self.playlist.addMedia(
QMediaContent(
QUrl.fromLocalFile(path)
)
)
self.model.layoutChanged.emit()
def update_duration(self, mc):
self.timeSlider.setMaximum(self.player.duration())
duration = self.player.duration()
if duration >= 0:
self.totalTimeLabel.setText(hhmmss(duration))
def update_position(self, *args):
position = self.player.position()
if position >= 0:
self.currentTimeLabel.setText(hhmmss(position))
self.timeSlider.blockSignals(True)
self.timeSlider.setValue(position)
self.timeSlider.blockSignals(False)
def playlist_selection_changed(self, ix):
# Мы получаем QItemSelection от selectionChanged.
i = ix.indexes()[0].row()
self.playlist.setCurrentIndex(i)
def playlist_position_changed(self, i):
if i > -1:
ix = self.model.index(i)
self.playlistView.setCurrentIndex(ix)
def toggle_viewer(self, state):
if state:
if self.player.state():
self.viewer.show()
else:
self.widgetForCv2.thread.start()
QTimer.singleShot(300, self.widgetForCv2.show)
else:
self.viewer.hide()
self.widgetForCv2.hide()
def erroralert(self, *args):
print(args)
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
app.setApplicationName("Keyboard")
app.setStyle("Fusion")
palette = QPalette()
palette.setColor(QPalette.Window, QColor(53, 53, 53))
palette.setColor(QPalette.WindowText, Qt.white)
palette.setColor(QPalette.Base, QColor(25, 25, 25))
palette.setColor(QPalette.AlternateBase, QColor(53, 53, 53))
palette.setColor(QPalette.ToolTipBase, Qt.white)
palette.setColor(QPalette.ToolTipText, Qt.white)
palette.setColor(QPalette.Text, Qt.white)
palette.setColor(QPalette.Button, QColor(53, 53, 53))
palette.setColor(QPalette.ButtonText, Qt.white)
palette.setColor(QPalette.BrightText, Qt.red)
palette.setColor(QPalette.Link, QColor(42, 130, 218))
palette.setColor(QPalette.Highlight, QColor(42, 130, 218))
palette.setColor(QPalette.HighlightedText, Qt.black)
app.setPalette(palette)
app.setStyleSheet(
"QToolTip { color: #ffffff; background-color: #2a82da; border: 1px solid white; }")
window = MainWindow()
window.show()
sys.exit(app.exec_())
MainWindow.py преобразованный из ".ui".
Параметр "self.OpacitySlider
" отвечает за слайдер на главном окне, хотелось подключить его к отдельному окну, но можно и другие варианты.
MainWindow.py
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(390, 382)
MainWindow.setMaximumSize(QtCore.QSize(395, 384))
MainWindow.setFixedSize(QtCore.QSize(395, 384))
self.centralWidget = QtWidgets.QWidget(MainWindow)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Maximum)
sizePolicy.setHorizontalStretch(390)
sizePolicy.setVerticalStretch(382)
sizePolicy.setHeightForWidth(self.centralWidget.sizePolicy().hasHeightForWidth())
self.centralWidget.setSizePolicy(sizePolicy)
self.centralWidget.setObjectName("centralWidget")
self.playlistView = QtWidgets.QListView(self.centralWidget)
self.playlistView.setEnabled(True)
self.playlistView.setGeometry(QtCore.QRect(20, 0, 351, 252))
self.playlistView.setMaximumSize(QtCore.QSize(16777210, 16777210))
self.playlistView.setAcceptDrops(True)
self.playlistView.setProperty("showDropIndicator", True)
self.playlistView.setDragDropMode(QtWidgets.QAbstractItemView.DropOnly)
self.playlistView.setDefaultDropAction(QtCore.Qt.CopyAction)
self.playlistView.setAlternatingRowColors(True)
self.playlistView.setUniformItemSizes(True)
self.playlistView.setObjectName("playlistView")
self.OpacitySlider = QtWidgets.QSlider(self.centralWidget)
self.OpacitySlider.setGeometry(QtCore.QRect(10, 280, 22, 61))
self.OpacitySlider.setMinimumSize(QtCore.QSize(22, 0))
self.OpacitySlider.setStyleSheet("border-bottom-color: rgb(255, 255, 127);\n"
"gridline-color: rgb(85, 170, 255);\n"
"selection-color: rgb(255, 158, 158);")
self.OpacitySlider.setOrientation(QtCore.Qt.Vertical)
self.OpacitySlider.setObjectName("OpacitySlider")
self.timeSlider = QtWidgets.QSlider(self.centralWidget)
self.timeSlider.setGeometry(QtCore.QRect(60, 270, 281, 22))
self.timeSlider.setOrientation(QtCore.Qt.Horizontal)
self.timeSlider.setObjectName("timeSlider")
self.currentTimeLabel = QtWidgets.QLabel(self.centralWidget)
self.currentTimeLabel.setGeometry(QtCore.QRect(-30, 270, 80, 16))
self.currentTimeLabel.setMinimumSize(QtCore.QSize(80, 0))
self.currentTimeLabel.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
self.currentTimeLabel.setObjectName("currentTimeLabel")
self.totalTimeLabel = QtWidgets.QLabel(self.centralWidget)
self.totalTimeLabel.setGeometry(QtCore.QRect(350, 270, 80, 16))
self.totalTimeLabel.setMinimumSize(QtCore.QSize(80, 0))
self.totalTimeLabel.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter)
self.totalTimeLabel.setObjectName("totalTimeLabel")
self.volumeSlider = QtWidgets.QSlider(self.centralWidget)
self.volumeSlider.setGeometry(QtCore.QRect(283, 300, 101, 22))
self.volumeSlider.setMaximum(100)
self.volumeSlider.setProperty("value", 100)
self.volumeSlider.setOrientation(QtCore.Qt.Horizontal)
self.volumeSlider.setObjectName("volumeSlider")
self.label = QtWidgets.QLabel(self.centralWidget)
self.label.setGeometry(QtCore.QRect(250, 301, 21, 22))
self.label.setText("")
self.label.setPixmap(QtGui.QPixmap("images\speaker-volume.png"))
self.label.setObjectName("label")
self.pauseButton = QtWidgets.QPushButton(self.centralWidget)
self.pauseButton.setGeometry(QtCore.QRect(109, 301, 28, 24))
self.pauseButton.setText("")
icon = QtGui.QIcon()
icon.addPixmap(QtGui.QPixmap("images/control-pause.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.pauseButton.setIcon(icon)
self.pauseButton.setObjectName("pauseButton")
self.playButton = QtWidgets.QPushButton(self.centralWidget)
self.playButton.setGeometry(QtCore.QRect(75, 301, 28, 24))
self.playButton.setText("")
icon1 = QtGui.QIcon()
icon1.addPixmap(QtGui.QPixmap("images/control.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.playButton.setIcon(icon1)
self.playButton.setObjectName("playButton")
self.previousButton = QtWidgets.QPushButton(self.centralWidget)
self.previousButton.setGeometry(QtCore.QRect(41, 301, 28, 24))
self.previousButton.setText("")
icon2 = QtGui.QIcon()
icon2.addPixmap(QtGui.QPixmap("images/control-skip-180.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.previousButton.setIcon(icon2)
self.previousButton.setObjectName("previousButton")
self.viewButton = QtWidgets.QPushButton(self.centralWidget)
self.viewButton.setGeometry(QtCore.QRect(211, 301, 28, 24))
self.viewButton.setText("")
icon3 = QtGui.QIcon()
icon3.addPixmap(QtGui.QPixmap("images/application-image.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.viewButton.setIcon(icon3)
self.viewButton.setCheckable(True)
self.viewButton.setObjectName("viewButton")
self.stopButton = QtWidgets.QPushButton(self.centralWidget)
self.stopButton.setGeometry(QtCore.QRect(143, 301, 28, 24))
self.stopButton.setText("")
icon4 = QtGui.QIcon()
icon4.addPixmap(QtGui.QPixmap("images/control-stop-square.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.stopButton.setIcon(icon4)
self.stopButton.setObjectName("stopButton")
self.nextButton = QtWidgets.QPushButton(self.centralWidget)
self.nextButton.setGeometry(QtCore.QRect(177, 301, 28, 24))
self.nextButton.setText("")
icon5 = QtGui.QIcon()
icon5.addPixmap(QtGui.QPixmap("images/control-skip.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.nextButton.setIcon(icon5)
self.nextButton.setObjectName("nextButton")
MainWindow.setCentralWidget(self.centralWidget)
self.menuBar = QtWidgets.QMenuBar(MainWindow)
self.menuBar.setGeometry(QtCore.QRect(0, 0, 390, 21))
self.menuBar.setObjectName("menuBar")
self.menuFIle = QtWidgets.QMenu(self.menuBar)
self.menuFIle.setObjectName("menuFIle")
MainWindow.setMenuBar(self.menuBar)
self.statusBar = QtWidgets.QStatusBar(MainWindow)
self.statusBar.setObjectName("statusBar")
MainWindow.setStatusBar(self.statusBar)
self.open_file_action = QtWidgets.QAction(MainWindow)
self.open_file_action.setObjectName("open_file_action")
self.menuFIle.addAction(self.open_file_action)
self.menuBar.addAction(self.menuFIle.menuAction())
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "Failamp"))
self.currentTimeLabel.setText(_translate("MainWindow", "0:00"))
self.totalTimeLabel.setText(_translate("MainWindow", "0:00"))
self.menuFIle.setTitle(_translate("MainWindow", "FIle"))
self.open_file_action.setText(_translate("MainWindow", "Open file..."))
Источник: Stack Overflow на русском