Конфликт между Qwebengineview и Qvideowidget pyqt5? [закрыто]Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Конфликт между Qwebengineview и Qvideowidget pyqt5? [закрыто]

Сообщение Anonymous »

Я пишу свою IDE, и, согласно своему плану, должно быть возможно работать напрямую с переполнением стека (в будущем) и открытыми файлами различных форматов (включая видео). Вот код трех сценариев, в которых происходит все работы:
main.py:
import sys
import os
from PyQt5.QtWidgets import (
QApplication, QMainWindow, QTextEdit, QVBoxLayout, QWidget, QAction, QFileDialog,
QPushButton, QStackedWidget, QListWidget, QHBoxLayout, QTabWidget, QToolButton, QTabBar, QSplitter
)
from PyQt5.QtWebEngineWidgets import QWebEngineView
from PyQt5.QtCore import Qt, QUrl
from PyQt5.QtGui import QFont, QIcon
import subprocess
import json
import file_filters
from PyQt5.QtMultimedia import QMediaPlayer, QMediaContent
from PyQt5.QtMultimediaWidgets import QVideoWidget

class VideoTab(QWidget):
def __init__(self, name, folder):
super().__init__()
self.name = name
self.folder = folder
self.path = os.path.join(folder, name)
self.check_path = folder + '/' + name
self.vLayout = QVBoxLayout(self)
self.video_widget = QVideoWidget()

self.pause_but = QPushButton("Play")
self.pause_but.clicked.connect(self.pause_but_acc)

self.vLayout.addWidget(self.video_widget, stretch=1)
self.vLayout.addWidget(self.pause_but, alignment=Qt.AlignCenter)

self.isPlaying = False
self.player = QMediaPlayer()
self.player.setVolume(100)
self.player.setVideoOutput(self.video_widget)
self.player.setMedia(QMediaContent(QUrl.fromLocalFile(self.path)))

self.video_widget.show()

def pause_but_acc(self):
if not self.isPlaying:
self.player.play()
self.isPlaying = True
self.pause_but.setText("Pause")
else:
self.player.pause()
self.isPlaying = False
self.pause_but.setText('Play')

def close_tab(self):
try:
self.player.pause()
except:
pass
self.player.setVideoOutput(None)
self.vLayout.removeWidget(self.video_widget)

self.video_widget.setParent(None)
self.video_widget.deleteLater()

self.video_widget = None

class PythonIDE(QMainWindow):
def __init__(self):
super().__init__()
self.so_engine = QWebEngineView()
self.so_engine.setUrl(QUrl("https://stackoverflow.com"))
self.last_tab = None
self.save_time = 10000
self.current_file = None
self.new_file_status = False
self.initUI()

def initUI(self):

self.setWindowTitle("SIDE")
self.setGeometry(100, 100, 800, 600)

self.mainWin = QStackedWidget()

self.editor_container = QWidget()

self.splited_editor_container = QSplitter()

self.editor_widget = QSplitter(Qt.Vertical)

self.editor_underwidget = QTabWidget()
self.editor_underwidget.setMovable(True)

self.folder_group = QWidget()
self.folder_layout = QVBoxLayout()
self.folder_but_layout = QHBoxLayout()
self.folder_widget = QListWidget()
self.setFolder_but = QPushButton("F")
self.setFolder_but.clicked.connect(self.openFolder)
self.setFolder_but.setFixedSize(30, 30)
self.newFile_folder_but = QPushButton("+")
self.newFile_folder_but.setFixedSize(30, 30)
self.folder_but_layout.addWidget(self.setFolder_but, alignment = Qt.AlignLeft)
self.folder_but_layout.addWidget(self.newFile_folder_but, alignment = Qt.AlignRight)
self.folder_layout.addLayout(self.folder_but_layout)
self.folder_layout.addWidget(self.folder_widget)
self.folder_group.setLayout(self.folder_layout)

self.editor_widget.addWidget(self.editor_underwidget)
self.splited_editor_container.addWidget(self.folder_group)
self.splited_editor_container.addWidget(self.editor_widget)

layout = QVBoxLayout()
layout.addWidget(self.splited_editor_container)
self.editor_container.setLayout(layout)

self.so_container = QWidget()
self.so_layout = QVBoxLayout()
self.so_layout.addWidget(self.so_engine)
self.so_container.setLayout(self.so_layout)

self.mainWin.addWidget(self.editor_container)
self.mainWin.addWidget(self.so_container)
self.setCentralWidget(self.mainWin)
self.mainWin.setCurrentWidget(self.editor_container)

self.create_menu()

def create_menu(self):
self.menubar = self.menuBar()

# menu "Tools"
self.tools_menu = self.menubar.addMenu("Tools")

self.editor_menu = QAction("Editor", self)
self.editor_menu.triggered.connect(self.switch_to_editor)
self.tools_menu.addAction(self.editor_menu)

self.questions_menu = QAction('StackOverflow', self)
self.questions_menu.triggered.connect(self.switch_to_questions)
self.tools_menu.addAction(self.questions_menu)

def switch_to_editor(self):
self.mainWin.setCurrentWidget(self.editor_container)
import gc
gc.collect()

def switch_to_questions(self):
self.mainWin.setCurrentWidget(self.so_container)

self.so_layout.addWidget(self.so_engine)

def openFolder(self):
self.new_file_status = False
self.current_folder = QFileDialog.getExistingDirectory()

self.setFolder_widget()

def setFolder_widget(self):
try:
self.working_files = os.listdir(self.current_folder)
self.folder_widget.clear()
self.folder_widget.addItems(self.working_files)
self.folder_widget.itemClicked.connect(self.process_item)
except:
pass
def process_item(self, item):
file_filters.process_file(item.text(), self.current_folder, self.editor_underwidget)

extensions = {"text": {"text": [".txt", ".json"], "scripts": [".py", ".pyw", ".pyi", ".c", ".h", ".cs", ".cpp"," .cxx", ".hpp", ".java", ".class", ".js", ".html"]},"image": [".png", ".jpg", "jpeg"],"audio": [".mp3", ".wav", ".aac", ".ogg"],"video": [".mp4", ".avi"],"anims": [".gif", ".mng"]}

def process_file(name, folder, widget):
current_file = str(folder + "/" + name)
is_FileIn_widget = False
wid = False
for ind in range(widget.count()):
tab = widget.widget(ind)
if hasattr(tab, 'check_path'):
if tab.check_path == current_file:
is_FileIn_widget = True
widget.setCurrentIndex(ind)
break
else:
print('skip')
if is_FileIn_widget:
print('!')
else:
print('*')
if not is_FileIn_widget:

if not wid:
for ext in extensions["video"]:
if name.endswith(ext):
wid = VideoTab(name, folder)

try:
index = widget.addTab(wid, name)
close_button = QToolButton()
close_button.setIcon(QIcon("close_icon.png"))
close_button.setFixedSize(16, 16)
close_button.clicked.connect(lambda: close_tab(widget, widget.tabText(index), name, index))
widget.tabBar().setTabButton(index, QTabBar.RightSide, close_button)
widget.setCurrentIndex(index)
except Exception as e:
print('troubles:', e)

def close_tab(tab_widget, text, name, indx):
print(f'close button closed with name {name} and index {indx}')
for ind in range(tab_widget.count()):
if tab_widget.tabText(ind) == name:
tab = tab_widget.widget(ind)
if hasattr(tab, 'close_tab'):
save_close = getattr(tab, 'close_tab')
save_close()
else:
print('error: close function did not found')
tab.setParent(None)
tab.deleteLater()
tab_widget.removeTab(ind)
break

if __name__ == "__main__":
app = QApplication(sys.argv)
ide = PythonIDE()
ide.showMaximized()
sys.exit(app.exec_())
< /code>
Но когда я открываю видеотуру, а затем перейду на вкладку переполнения стека, приложение начинает дико заморозить и сбой - виджеты подходят друг другу, работа замедляется, FPS падает. Однако эти проблемы не исчезают даже после закрытия видео, только после перезапуска приложения. Кроме того, кстати, существует очень неприятной визуальной ошибки, которая появляется даже при создании qwebengineview - это список вкладок в верхней части qtabwidget, при создании видео, он выдвигает экран для одной миллисекунды. Затем восстановлено (этого нет, так как я еще не завершил эту систему, но я сомневаюсь, что это поможет). В результате ошибка исчезает только в том случае, если вы не используете один из элементов - видео вкладка или окно с веб -сайтом. Поэтому, если они как-то несовместимы, пожалуйста, скажите так. /> Upd. Я перешел на Pyqt6, и все сработало. Вопрос можно считать решением.

Подробнее здесь: https://stackoverflow.com/questions/795 ... dget-pyqt5
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Конфликт между Qwebengineview и Qvideowidget pyqt5? [закрыто]
    Anonymous » » в форуме Python
    0 Ответы
    9 Просмотры
    Последнее сообщение Anonymous
  • Конфликт между Qwebengineview и Qvideowidget pyqt5? [закрыто]
    Anonymous » » в форуме Python
    0 Ответы
    5 Просмотры
    Последнее сообщение Anonymous
  • PyQt5: Как загрузить значок для QWebEngineView?
    Anonymous » » в форуме Python
    0 Ответы
    23 Просмотры
    Последнее сообщение Anonymous
  • Скопируйте выделенный текст из PDF в PyQt5 QWebEngineView
    Anonymous » » в форуме Python
    0 Ответы
    35 Просмотры
    Последнее сообщение Anonymous
  • QVideoWidget() не работает с безрамочным окном и полупрозрачным фоном
    Anonymous » » в форуме Python
    0 Ответы
    24 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»