PyQt5 показывает белую рамку при отображении изображения в полноэкранном режимеPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 PyQt5 показывает белую рамку при отображении изображения в полноэкранном режиме

Сообщение Anonymous »

Я использую PyQt5 для создания пользовательского интерфейса для своего приложения компьютерного зрения. В приложении шесть страниц, и на четвертой странице я получаю видеокадры из внутреннего потока, который запускается, когда приложение достигает этой страницы. Однако у меня возникли проблемы с корректным изменением размера QLabel на четвертой странице и отображением видеокадров в полноэкранном режиме.
Вот фрагмент кода, который отправляет кадры в интерфейс:

Код: Выделить всё

qImg = QImage(combined_frame2.data, combined_frame2.shape[1], combined_frame2.shape[0], QImage.Format_RGB888)
self.update_video_frame.emit(qImg.rgbSwapped())
Вот класс четвертой страницы:

Код: Выделить всё

class FourthPage(QWidget):
recording_finished = pyqtSignal()
switch_to_fifth_page = pyqtSignal()

def __init__(self, parent=None):
super().__init__(parent)
self.initUI()

def initUI(self):
self.setContentsMargins(0, 0, 0, 0)

# Set up the video label to take up the entire space
self.video_label = QLabel(self)
self.video_label.setAlignment(Qt.AlignCenter)
self.video_label.setStyleSheet("background-color: transparent;")  # Optional:  Set transparent background

# Set video_label to cover the entire widget
self.video_label.setGeometry(0, 0, self.width(), self.height())

self.click_player = QMediaPlayer()

# Install event filter to detect clicks on the video label
self.video_label.installEventFilter(self)

def resizeEvent(self, event):
# Ensure video_label resizes with the widget
self.video_label.setGeometry(0, 0, self.width(), self.height())

def stopRecording(self):
self.recording_finished.emit()

def playClickSound(self):
self.click_player.setMedia(QMediaContent(QUrl.fromLocalFile("/path/to/Click.mp3")))
self.click_player.setVolume(100)
self.click_player.play()

def handleMouseClick(self):
self.stopRecording()
self.playClickSound()
QTimer.singleShot(500, self.switch_to_fifth_page.emit)

def eventFilter(self, source, event):
if event.type() == QEvent.MouseButtonPress and source == self.video_label:
self.handleMouseClick()
return True
return super().eventFilter(source, event)
Вот основной класс, который управляет работой приложения:

Код: Выделить всё

class MainWindow(QWidget):
def __init__(self):
super().__init__()
self.stack = QStackedWidget(self)
self.setWindowFlags(Qt.WindowType.FramelessWindowHint)
self.setGeometry(0, 0, 800, 600)
self.showFullScreen()
self.initUI()

def initUI(self):
layout = QVBoxLayout(self)
self.introPage = IntroPage()
self.firstPage = FirstPage()
self.secondPage = SecondPage()
self.thirdPage = ThirdPage()
self.fourthPage = FourthPage()
self.startRecordingPage = StartRecordingPage()
self.fifthPage = FifthPage()
self.sixthPage = SixthPage()
self.stack.addWidget(self.introPage)
self.stack.addWidget(self.firstPage)
self.stack.addWidget(self.secondPage)
self.stack.addWidget(self.thirdPage)
self.stack.addWidget(self.startRecordingPage)
self.stack.addWidget(self.fourthPage)
self.stack.addWidget(self.fifthPage)
self.stack.addWidget(self.sixthPage)
layout.addWidget(self.stack)
self.setLayout(layout)

self.introPage.switch_to_first_page.connect(self.showFirstPage)
self.firstPage.switch_to_second_page.connect(self.showSecondPage)
self.secondPage.switch_to_third_page.connect(self.showThirdPage)
self.thirdPage.switch_to_recording_page.connect(self.showStartRecordingPage)
self.startRecordingPage.switch_to_fourth_page.connect(self.showFourthPage)
self.fourthPage.switch_to_fifth_page.connect(self.showFifthPage)
self.fourthPage.recording_finished.connect(self.stopRecording)
self.sixthPage.restart_requested.connect(self.restartApp)
self.sixthPage.exit_requested.connect(self.exitApp)

self.backend_thread = BackendThread()
self.backend_thread.update_video_frame.connect(self.update_video_frame)
self.backend_thread.finished.connect(self.showSixthPage)
self.showFullScreen()

def stopRecording(self):
self.backend_thread.stop_recording = True

def showFirstPage(self):
self.stack.setCurrentWidget(self.firstPage)

def showSecondPage(self):
self.stack.setCurrentWidget(self.secondPage)

def showThirdPage(self):
self.stack.setCurrentWidget(self.thirdPage)

def showStartRecordingPage(self):
self.stack.setCurrentWidget(self.startRecordingPage)

def showFourthPage(self):
self.stack.setCurrentWidget(self.fourthPage)
self.backend_thread.start()

def showFifthPage(self):
self.stack.setCurrentWidget(self.fifthPage)
QTimer.singleShot(100, self.run_processing)  # Delay the processing to allow the UI to update

def showSixthPage(self):
self.stack.setCurrentWidget(self.sixthPage)
self.display_results()

def run_processing(self):
self.backend_thread.run_processing()

def update_video_frame(self,  qImg):
self.fourthPage.video_label.setPixmap(QPixmap.fromImage(qImg))

def display_results(self):
font = self.sixthPage.results_label.font()
font.setPointSize(14)
self.sixthPage.results_label.setFont(font)
self.sixthPage.results_label.setWordWrap(True)
self.sixthPage.results_label.setFixedWidth(self.width() - 20)
self.sixthPage.results_label.setText(
f"Frame count: {self.backend_thread.frame_count}\n"
f"FPS: {self.backend_thread.fps}\n"
f"Transcript: {self.backend_thread.transcript}\n"
f"Objects List: {self.backend_thread.objects_list}\n"
f"Phrase Timestamps: {self.backend_thread.phrase_timestamps}\n"
)

def restartApp(self):
self.stack.setCurrentWidget(self.introPage)

def exitApp(self):
QApplication.instance().quit()
Проблема: QLabel на четвертой странице неправильно меняет размер для отображения видеокадров в полноэкранном режиме. Я пробовал разные варианты интервалов и полей, но ни один из них не работает. Он дает белые границы слева, справа и сверху.
Вопрос: Как я могу гарантировать, что QLabel правильно изменяет размер и отображает видеокадры полностью экран на четвертой странице?
Будем благодарны за любую помощь или предложения!

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

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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