def _setup_ign_pt_map_lgnd(self): colors = self._ign_pt_editor.colors() fuel_types = self._ign_pt_editor.fuel_types() assert len(colors) == len( fuel_types), "Length of colors != length of fuel_types" # Create the ignition point legend res_label = QLabel() res_label.setText('Resolution') res_label.setFixedSize(65, 20) self._ign_pt_type_grid_layout.addWidget(res_label, 0, 0) res = QLabel() res.setText(str(self._ign_pt_editor.resolution()) + 'm') res.setMaximumSize(35, 10) self._ign_pt_type_grid_layout.addWidget(res, 0, 1) for i in range(len(colors)): legend_label = QLabel() legend_label.setText(fuel_types[i]) self._ign_pt_type_grid_layout.addWidget(legend_label, i + 1, 0) legend_label.setFixedSize(65, 20) g_view = QGraphicsView() pallete = g_view.palette() pallete.setColor(g_view.backgroundRole(), colors[i]) g_view.setPalette(pallete) g_view.setMaximumSize(25, 10) self._ign_pt_type_grid_layout.addWidget(g_view, i + 1, 1) self.ignition_point_map_legend_scroll_area.setWidget( self._ign_pt_type_grid_layout_widget) self.ignition_point_legend_tab.setEnabled(True)
class VideoShow(QtWidgets.QWidget): def __init__(self, parent=None): super().__init__() self.parent = parent self.setupUi(self) self.start() #self.turnOnOrOffButton(False) def start(self): self.toolButton.setEnabled(False) self.listStartTime = [] self.indexNextSub = 0 self.isEnableSub = False self.isEnableSub2 = False self.isOpenedVideo = False self.loadedPath = ['', '', ''] # video, sub1, sub2 self.isEngOrVieOrTwiceSubLabel = 3 self.buttonCtrlPressed = False self.skipTime = 500 # Tắt focus để bắt sự kiện button arrow !!! def setChildrenFocusPolicy(self, policy): def recursiveSetChildFocusPolicy(parentQWidget): for childQWidget in parentQWidget.findChildren(QWidget): childQWidget.setFocusPolicy(policy) recursiveSetChildFocusPolicy(childQWidget) recursiveSetChildFocusPolicy(self) def keyReleaseEvent(self, event): if event.key() == Qt.Key_Control: self.buttonCtrlPressed = False def keyPressEvent(self, event): #print(self.buttonCtrlPressed) self.notificationVideo.setText('') if event.key() == Qt.Key_Control: self.buttonCtrlPressed = True #print(self.isFullScreen()) if event.key() == Qt.Key_Escape and self.isFullScreen(): self.fullScreen() if event.key() == Qt.Key_Enter: if self.frameSlider.isHidden(): self.frameSlider.show() self.frameButton.show() else: self.frameSlider.hide() self.frameButton.hide() if event.key() == Qt.Key_Space: self.play() if event.key() == Qt.Key_Right: self.forwardVideo() if event.key() == Qt.Key_Left: self.backwardVideo() if event.key() == Qt.Key_Comma and not self.buttonCtrlPressed: self.backwardSub() if event.key() == Qt.Key_Period and not self.buttonCtrlPressed: self.forwardSub() if event.key() == Qt.Key_E: self.isEngOrVieOrTwiceSubLabel = 1 self.setLabelVieo(1) if event.key() == Qt.Key_V: self.isEngOrVieOrTwiceSubLabel = 2 self.setLabelVieo(2) if event.key() == Qt.Key_T: self.isEngOrVieOrTwiceSubLabel = 3 self.setLabelVieo(3) if event.key( ) == Qt.Key_S and not self.buttonCtrlPressed: # sử dụng thêm keyReleaseEvent để đánh dấu nút ctrl if self.labelVideo.isVisible(): self.labelVideo.setVisible(False) else: self.labelVideo.setVisible(True) if event.key() == Qt.Key_F: self.fullScreen() modifiers = QtWidgets.QApplication.keyboardModifiers() if modifiers == QtCore.Qt.ControlModifier and event.key( ) == Qt.Key_Comma: print('skip -%d' % self.skipTime) self.skipSub(-1) if modifiers == QtCore.Qt.ControlModifier and event.key( ) == Qt.Key_Period: print('skip +%d' % self.skipTime) self.skipSub(1) if modifiers == QtCore.Qt.ControlModifier and event.key() == Qt.Key_S: self.saveCoupleFromButtonEvent() # mouseMouve Event # def mouseMoveEvent(self, event): # if self.frameSlider.isHidden(): # self.frameSlider.show() # print('show frameslider') # QThread.sleep(3) # self.frameSlider.hide() # print('hide frameslider') def setLabelVieo(self, typeof): if self.labelVideo.text() != '': if self.indexNextSub != 0 or self.indexNextSub != len( self.listStartTime) - 1: text = self.listStartTime[self.indexNextSub - 1][0].text() else: text = self.listStartTime[self.indexNextSub][0].text() if typeof == 1 and self.isEnableSub: self.labelVideo.setText(text.split('\n')[0]) elif typeof == 2 and self.isEnableSub2: self.labelVideo.setText(text.split('\n')[1]) elif self.isEnableSub and self.isEnableSub2: self.labelVideo.setText(text) def turnOnOrOffSubVideoLabel(self): if self.labelVideo.isVisible(): self.labelVideo.setVisible(False) else: self.labelVideo.setVisible(True) def forwardVideo(self): pos = self.mediaPlayer.position() if self.isEnableSub: if self.indexNextSub >= 1: self.indexNextSub -= 1 self.grabIndexCurrent(pos + 10000, len(self.listStartTime) - 1, 1) self.mediaPlayer.setPosition(pos + 10000) def backwardVideo(self): pos = self.mediaPlayer.position() if self.isEnableSub: if self.indexNextSub < len(self.listStartTime) - 1: self.indexNextSub += 1 if pos > self.maxTimeVideo: pos = self.maxTimeVideo self.grabIndexCurrent(pos - 10000, 0, -1) self.mediaPlayer.setPosition(pos - 10000) def forwardSub(self): if self.isEnableSub: self.mediaPlayer.setPosition( self.listStartTime[self.indexNextSub][2]) self.setStatusScrollArea() def backwardSub(self): if self.isEnableSub and self.indexNextSub >= 2: self.indexNextSub -= 2 self.mediaPlayer.setPosition( self.listStartTime[self.indexNextSub][2]) self.setStatusScrollArea() def skipSub(self, direction): # if self.isEnableSub: # self.setStatusScrollArea() for item in self.listStartTime: item[2] += self.skipTime * direction item[3] += self.skipTime * direction self.notificationVideo.setText('skip %d' % (direction * self.skipTime)) def calculateTime(self, subRipTime): time = str(subRipTime).replace(',', ':') time = time.split(':') time = list(map(lambda x: int(x), time)) time = (time[0] * 3600 + time[1] * 60 + time[2]) * 1000 + time[3] return time def saveCoupleFromButtonEvent(self): if self.isEnableSub and self.isEnableSub2: checkbox = None if self.indexNextSub != 0: checkbox = self.listStartTime[self.indexNextSub - 1][0] else: checkbox = self.listStartTime[self.indexNextSub][0] if checkbox.isChecked(): checkbox.setChecked(False) else: checkbox.setChecked(True) self.saveCouple(checkbox) def saveCouple(self, checkbox): if self.isEnableSub and not self.actionOpenSub2.isEnabled(): text = checkbox.text() if text.find('\n') == -1: checkbox.setEnabled(False) QtWidgets.QMessageBox.information( None, 'WARNING', "Can't save with single sentence") return couple = text.split('\n') print(checkbox.isChecked()) if not checkbox.isChecked(): self.parent.parent.DictDB.delete('ENG', couple[0]) QtWidgets.QMessageBox.information(None, 'Notification', 'Couple was deleted !') else: result1 = self.parent.parent.DictDB.selectRowIDByEngOrVie( 'ENG', couple[0]) result2 = self.parent.parent.DictDB.selectRowIDByEngOrVie( 'VIE', couple[1]) if len(result1) == 0 and len(result2) == 0: self.parent.parent.DictDB.insert(couple[0], couple[1], 0) QtWidgets.QMessageBox.information(None, 'Notification', 'Couple was inserted !') else: QtWidgets.QMessageBox.information( None, 'WARNING', 'Couple already exist in revision') self.buttonCtrlPressed = False def eventSubCheckBox(self, checkbox): def event(): self.saveCouple(checkbox) return event def eventSubButton(self, time, index): # time tính theo milisecond def event(): self.mediaPlayer.setPosition(time) self.indexNextSub = index self.setStatusScrollArea() return event def enableCheckBoxsOrButtonScroll(self, index): if self.isEnableSub: for item in self.listStartTime: item[index].setEnabled(True) def loadSubToScroll(self, fileName): subs = pysrt.open(fileName) for index, value in enumerate(subs): horizontalLayoutScroll = QtWidgets.QHBoxLayout() checkbox = QtWidgets.QCheckBox(self.scrollAreaWidgetContents) checkbox.setObjectName('checkbox%s' % (index)) text = value.text.replace('\n', ' ').replace("\"", "''") checkbox.setText(text.replace('\xa0', ' ')) checkbox.setFixedHeight(50) checkbox.setFont(QtGui.QFont('Times New Roman', 10)) checkbox.clicked.connect(self.eventSubCheckBox(checkbox)) checkbox.setFocusPolicy(Qt.NoFocus) button = QtWidgets.QToolButton(self.scrollAreaWidgetContents) button.setObjectName('button%s' % (index)) button.setFixedHeight(20) icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap("assets/access.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) button.setIcon(icon) button.setIconSize(QtCore.QSize(32, 32)) button.setFocusPolicy(Qt.NoFocus) checkbox.setEnabled(False) if not self.isOpenedVideo: button.setEnabled(False) startTime = self.calculateTime(value.start) endTime = self.calculateTime(value.end) button.clicked.connect(self.eventSubButton(startTime, index)) horizontalLayoutScroll.addWidget(checkbox, 0) horizontalLayoutScroll.addWidget(button, 10) horizontalLayoutScroll.setContentsMargins( 0, 0, 50, 0) # left, top, right, bottom self.verticalScroll.addLayout(horizontalLayoutScroll) self.listStartTime.append( [checkbox, button, startTime, endTime, value.start]) def LoadOtherSub(self, fileName): subs = pysrt.open(fileName) if subs[5].start == self.listStartTime[5][2] and subs[ 10].end == self.listStartTime[10][3]: for index, item in enumerate(self.listStartTime): while subs[0].start < item[4]: del subs[0] if subs[0].start == item[4]: text = subs[0].text.replace('\n', ' ').replace( '\xa0', ' ').replace("\"", "''") item[0].setText(item[0].text() + '\n' + text) del subs[0] self.actionOpenSub2.setEnabled(False) self.enableCheckBoxsOrButtonScroll(0) self.isEnableSub2 = True self.loadedPath[2] = fileName else: QtWidgets.QMessageBox.information( None, 'WARNING', 'Please choose correctly sub compatible with engsub') def clearLayout(self, layout): if layout is not None: while layout.count(): item = layout.takeAt(0) widget = item.widget() if widget is not None: widget.deleteLater() else: self.clearLayout(item.layout()) def closeEvent(self, event): reply = QtWidgets.QMessageBox.question(self, 'Message', "Are you sure to quit?", QtWidgets.QMessageBox.Yes, QtWidgets.QMessageBox.No) if reply == QtWidgets.QMessageBox.Yes: event.accept() self.mediaPlayer.stop() else: event.ignore() def reloadVideoAndSub(self): self.clearLayout(self.verticalScroll) #self.mediaPlayer.setMedia(QMediaPlayer.NoMedia) #self.mediaPlayer.destroyed() QMediaPlayer.stop(self.mediaPlayer) # init self.start() self.scrollArea.hide() self.actionOpenSub1.setEnabled(True) self.actionOpenSub2.setEnabled(False) print(len(self.listStartTime)) def turnOnOrOffButton(self, turn): buttons = [self.toolButton, self.toolButton_3, self.toolButton_4] map(lambda x: x.setEnabled(turn), buttons) def openVid(self, fileName): self.mediaPlayer.setMedia(QMediaContent(QUrl.fromLocalFile(fileName))) self.toolButton.setEnabled(True) self.enableCheckBoxsOrButtonScroll(1) self.isOpenedVideo = True self.loadedPath[0] = fileName #self.turnOnOrOffButton(True) self.play() def openEngSub(self, fileName): self.loadSubToScroll(fileName) self.scrollArea.show() self.isEnableSub = True self.actionOpenSub2.setEnabled(True) self.actionOpenSub1.setEnabled(False) self.loadedPath[1] = fileName def openFile(self, title): def open_file(): choose = -1 dialog = QtWidgets.QFileDialog() extension = '' if title == 'Open Video': extension = 'Videos (*.mkv *.mp4 *.mpg)' choose = 1 elif title == 'Open Eng Sub': extension = 'SRT (*.srt)' choose = 2 elif title == 'Open Viewed Video': pass else: extension = 'SRT (*.srt)' choose = 3 #dialog.setDefaultSuffix(".srt") fileName, _ = dialog.getOpenFileName(None, title, QDir.homePath(), extension) name = fileName.lower() if choose == 2: # quy ước loại sub sẽ đặt tên ở đuôi !!! if name[len(name) - 7:len(name) - 4] != 'eng': QtWidgets.QMessageBox.information( None, 'WARNING', 'Please choose correctly sub with format *eng.srt') return elif choose == 3: if name[len(name) - 7:len(name) - 4] != 'vie': QtWidgets.QMessageBox.information( None, 'WARNING', 'Please choose correctly sub with format *vie.srt') return if fileName != '': #self.loadSubToScroll() if title == 'Open Video': self.openVid(fileName) elif title == 'Open Eng Sub': self.openEngSub(fileName) else: self.LoadOtherSub(fileName) loaded = True for p in self.loadedPath: if p == '': loaded = False if loaded: with open('history.txt', 'w') as file: file.writelines(','.join(self.loadedPath)) return open_file def openViewedVideo(self): with open('history.txt', 'r') as file: paths = file.readlines()[0].split(',') self.openVid(paths[0]) self.openEngSub(paths[1]) self.LoadOtherSub(paths[2]) def play(self): icon = QtGui.QIcon() if self.mediaPlayer.state() == QMediaPlayer.PlayingState: self.mediaPlayer.pause() icon.addPixmap(QtGui.QPixmap("assets/pause.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.toolButton.setIcon(icon) else: icon.addPixmap(QtGui.QPixmap("assets/play.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.toolButton.setIcon(icon) self.mediaPlayer.play() def scrollToSub(self, curHeight, maxHeight): # dùng hệ thức chéo để tính tỉ lệ ! self.maxButtonPos = self.listStartTime[-1][1].y() pos = int(float(curHeight / self.maxButtonPos) * maxHeight) #print(pos, curHeight, maxHeight) self.scrollArea.verticalScrollBar().setValue(pos) # hàm sự kiện này có đối số position là mặc định !!! def setTextCheckBox(self, checkbox, color, size, italic_): checkbox.setStyleSheet('color: %s' % (color)) checkbox.setFont(QtGui.QFont('Times New Roman', size, italic=italic_)) def setStatusScrollArea(self): timeSub = self.listStartTime[self.indexNextSub] self.setTextCheckBox(timeSub[0], 'green', 15, True) if self.oldIndexSub != 0: self.setTextCheckBox(self.listStartTime[self.oldIndexSub][0], 'black', 10, False) self.scrollToSub(timeSub[1].y(), self.scrollArea.verticalScrollBar().maximum()) text = timeSub[0].text() if self.isEngOrVieOrTwiceSubLabel == 1: self.labelVideo.setText(text.split('\n')[0]) elif self.isEngOrVieOrTwiceSubLabel == 2: self.labelVideo.setText(text.split('\n')[1]) else: self.labelVideo.setText(text) self.oldIndexSub = self.indexNextSub if self.indexNextSub < len(self.listStartTime) - 1: self.indexNextSub += 1 def durationChanged(self, duration): self.positionSlider.setRange(0, duration) self.maxTimeVideo = duration self.labelDurationTime.setText(self.formatTimeToHMS(duration)) def positionChanged(self, position): self.positionSlider.setValue(position) self.labelCurTime.setText(self.formatTimeToHMS(position)) if self.isEnableSub: start = self.listStartTime[self.indexNextSub][2] end = self.listStartTime[self.indexNextSub][3] if position >= start and position <= end: self.setStatusScrollArea() def grabIndexCurrent(self, position, stopIndex, step): indexCur = self.indexNextSub for i in range(indexCur, stopIndex, step): start = self.listStartTime[i][2] end = self.listStartTime[i][3] if position >= start and position <= end: self.indexNextSub = i break if step == 1 and position >= end and position <= self.listStartTime[ i + 1][2]: self.indexNextSub = i + 1 break elif step == -1 and position <= start and position >= self.listStartTime[ i - 1][2]: self.indexNextSub = i break if indexCur == self.indexNextSub: if step == 1: self.indexNextSub = len(self.listStartTime) - 1 else: self.indexNextSub = 1 #print(self.indexNextSub) def formatTime(self, time): if len(time) == 1: return '0' + time return time def formatTimeToHMS(self, time): time = time / 1000 hour = int(time / 3600) minute = int((time - 3600 * hour) / 60) second = int(time - 3600 * hour - minute * 60) return '%s:%s:%s' % (self.formatTime( str(hour)), self.formatTime( str(minute)), self.formatTime(str(second))) # sliderMoved có sẵn tham số position cho slider để tùy chỉnh video !!! def sliderMoved(self, position): self.mediaPlayer.setPosition(position) def setSCrollbar(self, number): def setScroll(): #self.scrollArea.scrollContentsBy(0, number) #self.scrollAreaWidgetContents.scroll(number) vbar = self.scrollArea.verticalScrollBar() #print(vbar.maximum()) vbar.setValue(number) return setScroll def fullScreen(self): icon = QtGui.QIcon() if self.isFullScreen(): icon.addPixmap(QtGui.QPixmap("assets/fullscreen.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.toolButtonFullScreen.setIcon(icon) self.verticalLayout.setContentsMargins(9, 9, 9, 9) if self.isEnableSub: self.scrollArea.show() self.menubar.show() self.frameSlider.show() self.frameButton.show() self.showNormal() self.videoItem.setSize(QSizeF(600, 400)) #self.graphicsView.fitInView(QRectF(-400, -400, 400, 400), Qt.KeepAspectRatio) #self.graphicsView.setMaximumSize(QSize(600, 400)) #self.graphicsView.setAlignment(Qt.AlignCenter) self.labelVideo.hide() else: icon.addPixmap(QtGui.QPixmap("assets/minimize.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.toolButtonFullScreen.setIcon(icon) self.verticalLayout.setContentsMargins(0, 0, 0, 0) if self.isEnableSub: self.scrollArea.hide() self.menubar.hide() self.frameSlider.hide() self.frameButton.hide() self.showFullScreen() self.videoItem.setSize(QSizeF(self.width() - 1, self.height() - 2)) self.labelVideo.show() def setupUi(self, Form): self.sizeMonitor = [GetSystemMetrics(0), GetSystemMetrics(1)] self.setMouseTracking(True) self.form = Form Form.setObjectName("Form") Form.resize(631, 406) self.oldHighLine = None self.oldIndexSub = 0 self.mediaPlayer = QMediaPlayer(None, QMediaPlayer.VideoSurface) self.mediaPlayer.positionChanged.connect( self.positionChanged) # bắt frame video thay đổi self.mediaPlayer.durationChanged.connect( self.durationChanged) # bắt thời lượng video # Hàm này chỉ chạy có 1 lần !!! # Create Slider tạo thanh trượt video #self.positionSlider = QSlider(Qt.Horizontal) self.positionSlider = Slider(Qt.Horizontal) # truyền đối số Qt.Horizontal không dùng hàm __init__ nó sẽ kế thừa trực tiếp từ Horizontal # nếu dùng hàm __init__ nó sẽ ko kế thừa được mà chỉ tham chiếu đến lớp horizontal !!! self.positionSlider.parent = self self.positionSlider.setRange(0, 0) self.positionSlider.sliderMoved.connect(self.sliderMoved) # set event notify 500 millisecond QMediaObject.setNotifyInterval(self.mediaPlayer, 500) # Create Menubar self.menubar = QtWidgets.QMenuBar(Form) self.menubar.setFixedHeight(25) self.menuOpen = QtWidgets.QMenu(self.menubar) self.menuOpen.setObjectName('menuOpen') self.menuOption = QtWidgets.QMenu(self.menubar) self.menuOption.setObjectName('menuOption') self.actionReload = QtWidgets.QAction(Form) self.actionReload.setObjectName('actionReload') self.actionReload.triggered.connect(self.reloadVideoAndSub) self.menuOption.addAction(self.actionReload) self.actionOpenVideo = QtWidgets.QAction(Form) self.actionOpenVideo.setObjectName('openvideo') self.actionOpenSub1 = QtWidgets.QAction(Form) self.actionOpenSub1.setObjectName('openSub1') self.actionOpenSub1.triggered.connect(self.openFile('Open Eng Sub')) self.actionOpenSub2 = QtWidgets.QAction(Form) self.actionOpenSub2.setObjectName('openSub2') self.actionOpenSub2.triggered.connect(self.openFile('Open Vie Sub')) self.actionOpenViewedVideo = QtWidgets.QAction(Form) self.actionOpenViewedVideo.triggered.connect(self.openViewedVideo) self.menuOpen.addAction(self.actionOpenVideo) self.menuOpen.addAction(self.actionOpenSub1) self.menuOpen.addAction(self.actionOpenSub2) self.menuOpen.addAction(self.actionOpenViewedVideo) self.actionOpenVideo.triggered.connect(self.openFile('Open Video')) self.menubar.addAction(self.menuOpen.menuAction()) self.menubar.addAction(self.menuOption.menuAction()) self.actionOpenSub2.setEnabled(False) self.verticalLayout = QtWidgets.QVBoxLayout(Form) self.verticalLayout.setObjectName("verticalLayout") self.horizontalLayout = QtWidgets.QHBoxLayout() self.horizontalLayout.setObjectName("horizontalLayout") # create gridlayout contain scrollarea # self.gridLayout = QtWidgets.QGridLayout(Form) # self.gridLayout.setObjectName("gridLayout") # create scrollarea self.scrollArea = QtWidgets.QScrollArea(Form) self.scrollArea.setObjectName("scrollArea") self.scrollArea.setWidgetResizable(True) self.scrollArea.setMinimumSize(300, 400) self.scrollAreaWidgetContents = QtWidgets.QWidget() self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 430, 319)) self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents") self.scrollArea.setWidget(self.scrollAreaWidgetContents) # create verticalscroll # chú ý lớp cha là scroll widget content self.verticalScroll = QtWidgets.QVBoxLayout( self.scrollAreaWidgetContents) # self.gridLayout.addWidget(self.scrollArea) self.verticalLayout.addWidget(self.menubar, 0) scene = QGraphicsScene(self) self.graphicsView = QGraphicsView( scene) # dùng widget graphicsview mới overlay lable lên được !!! self.videoItem = QGraphicsVideoItem() self.videoItem.setSize(QSizeF(600, 400)) #self.graphicsView.setStyleSheet("background-color:black;") # dùng palette (bảng màu) riêng cho widget nên không ảnh hưởng đến labelvideo khi ghi đè lên p = self.graphicsView.palette() p.setColor(self.graphicsView.backgroundRole(), Qt.black) self.graphicsView.setPalette(p) scene.addItem(self.videoItem) self.horizontalLayout.addWidget(self.graphicsView) self.mediaPlayer.setVideoOutput(self.videoItem) # add label for videowidget represent subtitle self.labelVideo = QtWidgets.QLabel(self.graphicsView) self.labelVideo.setObjectName('labelVideo') self.labelVideo.setText('') self.labelVideo.setStyleSheet( "QLabel {font-size: 20px; opacity:1; color:white}") self.labelVideo.setFixedWidth(500) self.labelVideo.setFixedHeight(200) self.labelVideo.setAlignment(Qt.AlignCenter) self.labelVideo.setWordWrap(True) self.labelVideo.move(int(self.sizeMonitor[0] / 2 - 200), int(self.sizeMonitor[1] * 5 / 7)) #print(self.labelVideo.x(), self.labelVideo.y()) #self.labelVideo.raise_() #self.videoWidget.raise_() self.notificationVideo = QtWidgets.QLabel(self.graphicsView) self.notificationVideo.setObjectName('notificationVideo') self.notificationVideo.setText('') self.notificationVideo.setStyleSheet( "QLabel {font-size: 20px; opacity:1; color:white}") self.notificationVideo.setFixedWidth(500) self.notificationVideo.setFixedHeight(200) self.notificationVideo.setAlignment(Qt.AlignCenter) self.notificationVideo.setWordWrap(True) self.notificationVideo.move(int(self.sizeMonitor[0] / 2 + 200), int(self.sizeMonitor[1] * 2 / 7)) self.horizontalLayout.addWidget(self.scrollArea) self.verticalLayout.addLayout(self.horizontalLayout, 10) # cho stretch widget là 100% tức sẽ chiếm toàn bộ diện tích trong layout !!! # những widget khác cho 0% stretch # create layoutSlider self.horizontalLayoutSlider = QtWidgets.QHBoxLayout() self.horizontalLayoutSlider.setObjectName("horizontalLayoutSlider") self.labelCurTime = QtWidgets.QLabel(Form) self.labelCurTime.setObjectName('labelCurTime') self.labelCurTime.setText('00:00') self.labelDurationTime = QtWidgets.QLabel(Form) self.labelDurationTime.setText('NaN') self.labelDurationTime.setObjectName('labelDurationTime') self.horizontalLayoutSlider.addWidget(self.labelCurTime) self.horizontalLayoutSlider.addWidget(self.positionSlider) self.horizontalLayoutSlider.addWidget(self.labelDurationTime) #self.verticalLayout.addLayout(self.horizontalLayoutSlider,0) # Layout không thể hide được nên sẽ dùng frame (kế thừa từ widget) setlayout để hide nó self.frameSlider = QtWidgets.QFrame() self.frameSlider.setLayout(self.horizontalLayoutSlider) self.verticalLayout.addWidget(self.frameSlider, 0) self.horizontalLayout_2 = QtWidgets.QHBoxLayout() self.horizontalLayout_2.setObjectName("horizontalLayout_2") #self.verticalLayout.addLayout(self.horizontalLayout_2) self.toolButton = QtWidgets.QToolButton(Form) icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap("assets/play.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.toolButton.setIcon(icon) self.toolButton.setIconSize(QtCore.QSize(32, 32)) self.toolButton.setObjectName("toolButton") # Event play self.toolButton.clicked.connect(self.play) self.horizontalLayout_2.addWidget(self.toolButton) self.toolButton_3 = QtWidgets.QToolButton(Form) icon1 = QtGui.QIcon() icon1.addPixmap(QtGui.QPixmap("assets/previous.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.toolButton_3.setIcon(icon1) self.toolButton_3.setIconSize(QtCore.QSize(32, 32)) self.toolButton_3.setObjectName("toolButton_3") self.toolButton_3.clicked.connect(self.backwardVideo) self.horizontalLayout_2.addWidget(self.toolButton_3) self.toolButton_4 = QtWidgets.QToolButton(Form) icon2 = QtGui.QIcon() icon2.addPixmap(QtGui.QPixmap("assets/next.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.toolButton_4.setIcon(icon2) self.toolButton_4.setIconSize(QtCore.QSize(32, 32)) self.toolButton_4.setObjectName("toolButton_4") self.toolButton_4.clicked.connect(self.forwardVideo) self.horizontalLayout_2.addWidget(self.toolButton_4) #self.verticalLayout.addLayout(self.horizontalLayout_2,0) self.toolButtonFullScreen = QtWidgets.QToolButton(Form) self.toolButtonFullScreen.setObjectName('toolButtonFullScreen') icon3 = QtGui.QIcon() icon3.addPixmap(QtGui.QPixmap('assets/fullscreen.png'), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.toolButtonFullScreen.setIcon(icon3) self.toolButtonFullScreen.setIconSize(QtCore.QSize(32, 32)) self.horizontalLayout_2.addWidget(self.toolButtonFullScreen) self.toolButtonFullScreen.clicked.connect(self.fullScreen) # self.toolButton_3.clicked.connect(self.setSCrollbar(30)) # self.toolButton_4.clicked.connect(self.setSCrollbar(90)) self.frameButton = QtWidgets.QFrame() self.frameButton.setLayout(self.horizontalLayout_2) self.verticalLayout.addWidget(self.frameButton, 0) # turn on mousemove tracking for videowidget !!! #self.videoWidget.setMouseTracking(True) # tắt mục tiêu tập trung để nhật sự kiện arrow button self.setChildrenFocusPolicy(Qt.NoFocus) self.scrollArea.setFocusPolicy(Qt.NoFocus) # setcontentsmargins cho verticalLayout Tổng chứ ko phải cho Form !!! #self.verticalLayout.setContentsMargins(0,0,0,0) self.scrollArea.hide() self.retranslateUi(Form) QtCore.QMetaObject.connectSlotsByName(Form) def retranslateUi(self, Form): _translate = QtCore.QCoreApplication.translate Form.setWindowTitle(_translate("Form", "Study Film")) self.toolButton.setText(_translate("Form", "...")) self.toolButton_3.setText(_translate("Form", "...")) self.toolButton_4.setText(_translate("Form", "...")) self.menuOpen.setTitle(_translate("Form", "Open")) self.menuOption.setTitle(_translate("Form", "Option")) self.actionReload.setText(_translate("Form", 'Reload')) self.actionOpenVideo.setText(_translate("Form", 'Open video')) self.actionOpenSub1.setText(_translate("Form", 'Open Eng Sub')) self.actionOpenSub2.setText(_translate("Form", 'Open Vie Sub')) self.actionOpenViewedVideo.setText( _translate("Form", 'Open Viewed Video'))
class GameWindow(QMainWindow): def __init__(self, frame_cnt): super().__init__() # 初始化,load数据 self.img_list = [] self.cter_img_list = [] self.npc_img_list = [] for frame_it in range(frame_cnt): self.img_list.append(QImage('data/%03d.png' % frame_it)) for t in range(4): self.cter_img_list.append(QImage('imgs/001-Fighter01_big.png').copy(t * 96, 288, 96, 144)) self.npc_img_list.append(QImage('imgs/066-Beast04.png').copy(t * 96, 96, 96, 96)) self.dialog_img = QImage('imgs/001-Blue01.png').copy(130, 66, 28, 28) self.tri_img = [QImage('imgs/001-Blue01.png').copy(160, 64, 16, 16), QImage('imgs/001-Blue01.png').copy(160, 80, 16, 16)] # 准备图形界面 self.init_ui() self.frame_cnt = frame_cnt self.curr_frame = 0 # 当前处于第几帧 # 设置播放新帧的定时器 self.frame_timer = QTimer(self) self.frame_timer.timeout.connect(self.on_new_frame) self.frame_timer.start(40) def init_ui(self): # 设置窗口主题、大小和背景图片 self.setObjectName('MainWindow') self.setFixedSize(1300, 740) # 设置背景view self.bkgrd = QGraphicsView(self) self.bkgrd.setFixedSize(1280, 720) self.bkgrd.move(10, 10) self.bkgrd.setStyleSheet("background:transparent;border:none;") bkgrd_pixmap = QPixmap.fromImage((self.img_list[0])) bkgrd_pixmap.fromImage(self.img_list[0]) self.bkgrd_scene = QGraphicsScene() self.bkgrd_scene.addItem(QGraphicsPixmapItem(bkgrd_pixmap)) self.bkgrd.setScene(self.bkgrd_scene) # 小人 self.character = QGraphicsView(self) self.character.setFixedSize(96, 144) self.character.move(0, 500) self.character.setStyleSheet("background:transparent;border:none;") cter_pixmap = QPixmap.fromImage((self.cter_img_list[0])) cter_pixmap.fromImage(self.img_list[0]) self.cter_scene = QGraphicsScene() self.cter_scene.addItem(QGraphicsPixmapItem(cter_pixmap)) self.character.setScene(self.cter_scene) # NPC self.npc = QGraphicsView(self) self.npc.setFixedSize(96, 96) self.npc.move(1050, 530) self.npc.setStyleSheet("background:transparent;border:none;") npc_pixmap = QPixmap.fromImage((self.npc_img_list[0])) self.npc_scene = QGraphicsScene() self.npc_scene.addItem(QGraphicsPixmapItem(npc_pixmap)) self.npc.setScene(self.npc_scene) # 对话框 self.dialog = QGraphicsView(self) self.dialog.setFixedSize(1248, 208) self.dialog.move(26, 496) dialog_pixmap = QPixmap.fromImage(self.dialog_img) palette = QPalette() palette.setBrush(self.dialog.backgroundRole(), QBrush(dialog_pixmap)) self.dialog.setPalette(palette) self.dialog.hide() self.label = QLabel(self) self.label.setFont(QFont("宋体", 24, 40)) self.label.setFixedSize(1000, 100) self.label.move(60, 496) self.label.setText("啦啦啦啦啦") self.label.hide() # 对话框下面的小三角 self.tri = QGraphicsView(self) self.tri.setFixedSize(16, 16) self.tri.move(632, 696) self.tri.setStyleSheet("background:transparent;border:none;") tri_pixmap = QPixmap.fromImage(self.tri_img[0]) self.tri_scene = QGraphicsScene() self.tri_scene.addItem(QGraphicsPixmapItem(tri_pixmap)) self.tri.setScene(self.tri_scene) self.tri.hide() # 显示界面 self.show() def on_new_frame(self): self.curr_frame += 1 # 更新背景 bkgrd_pixmap = QPixmap.fromImage((self.img_list[self.curr_frame])) self.bkgrd_scene.clear() self.bkgrd_scene.addItem(QGraphicsPixmapItem(bkgrd_pixmap)) # 更新小人 if self.curr_frame % 6 == 0: cter_pixmap = QPixmap.fromImage((self.cter_img_list[int(self.curr_frame % 24 // 6)])) self.cter_scene.clear() self.cter_scene.addItem(QGraphicsPixmapItem(cter_pixmap)) npc_pixmap = QPixmap.fromImage((self.npc_img_list[int(self.curr_frame % 24 // 6)])) self.npc_scene.clear() self.npc_scene.addItem(QGraphicsPixmapItem(npc_pixmap)) if self.curr_frame % 12 == 0: tri_pixmap = QPixmap.fromImage((self.tri_img[int(self.curr_frame % 24 // 12)])) self.tri_scene.clear() self.tri_scene.addItem(QGraphicsPixmapItem(tri_pixmap)) if self.curr_frame <= 95: self.character.move(self.curr_frame * 10, 500) # 更新对话框 if self.curr_frame == 100: self.dialog.show() self.label.show() self.tri.show() if self.curr_frame == 192: self.dialog.hide() self.label.hide() self.tri.hide() if self.curr_frame == self.frame_cnt - 1: # 已达最后一帧 self.frame_timer.stop()