def addRadioButton(self, choice, default=False): """ Util func to add QRadioButton widget. """ rb = QRadioButton(choice) if default: rb.setChecked(True) sizePolicy = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Preferred) rb.setSizePolicy(sizePolicy) return rb
def createRadio(self, layout_selected, selected): from PyQt5.QtWidgets import QRadioButton, QSizePolicy from PyQt5.QtGui import QFont radioButton = QRadioButton() sizePolicy = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) radioButton.setSizePolicy(sizePolicy) radioButton.setObjectName("checkBox") radioButton.setChecked(selected) radioButton.clicked.connect(lambda: self.modify_value(layout_selected)) return radioButton
class Window(QWidget): def __init__(self): super().__init__() self.showMaximized() self.setWindowTitle('Barbequer') self.setWindowIcon(QIcon('BBQ.png')) self.init() def init(self): self.size_policy = (QSizePolicy.Expanding, QSizePolicy.Expanding) self.font = QFont() self.font.setPointSize(16) self.temp_display_label = QLabel(self) self.temp_display_label.setText('Current Temperature:') self.temp_display_label.setSizePolicy(self.size_policy[0], self.size_policy[1]) self.temp_display_label.setFont(self.font) # self.temp_display_label.setAlignment(Qt.AlignRight) self.temp_display = QLCDNumber(self) self.temp_display.setSizePolicy(self.size_policy[0], self.size_policy[1]) self.temp_display.setFont(self.font) self.temp_set_label = QLabel(self) self.temp_set_label.setText('Set Temperature:') self.temp_set_label.setSizePolicy(self.size_policy[0], self.size_policy[1]) self.temp_set_label.setFont(self.font) # self.temp_set_label.setAlignment(Qt.AlignRight) self.temp_set = QLCDNumber(self) self.temp_set.setSizePolicy(self.size_policy[0], self.size_policy[1]) self.temp_set.setFont(self.font) self.temp_dial = QDial(self) self.temp_dial.setSizePolicy(self.size_policy[0], self.size_policy[1]) self.temp_dial.setProperty('value', 0) self.temp_dial.setSliderPosition(0) self.temp_dial.setNotchesVisible(True) self.temp_dial.setMaximum(600) self.temp_dial.setToolTip('Set Desired Temperature in Fahrenheit') self.temp_dial.valueChanged.connect(self.update_temperature) self.exhasut_fan = QRadioButton('&Enable Exhaust Fan') self.exhasut_fan.setSizePolicy(self.size_policy[0], self.size_policy[1]) self.exhasut_fan.setFont(self.font) self.exhasut_fan.setToolTip('Enable exhaust fan') self.intake_fan = QRadioButton('&Enable Intake Fan') self.intake_fan.setSizePolicy(self.size_policy[0], self.size_policy[1]) self.intake_fan.setFont(self.font) self.intake_fan.setToolTip('Enable intake fan') self.start_button = QPushButton('Start', self) self.start_button.setSizePolicy(self.size_policy[0], self.size_policy[1]) self.start_button.setFont(self.font) self.start_button.setToolTip('Start Maintaining Temperature') self.start_button.clicked.connect(self.maintain_temperature) self.timer_button = QPushButton('Timer', self) self.timer_button.setSizePolicy(self.size_policy[0], self.size_policy[1]) self.timer_button.setFont(self.font) self.timer_button.setToolTip('Cook Time') qp = QPainter() qp.begin(self) qp.setPen(QPen(QColor(255, 80, 0), 3)) qp.setBrush(QColor(255, 80, 0)) qp.drawEllipse(QPoint(50, 60), 30, 30) qp.end() #add the grid layout to the interface self.layout = QGridLayout(self) self.layout.addWidget(self.temp_dial, 0, 0, 2, 2) self.layout.addWidget(self.temp_set_label, 2, 0) self.layout.addWidget(self.temp_set, 2, 1, 1, 2) self.layout.addWidget(self.temp_display_label, 3, 0) self.layout.addWidget(self.temp_display, 3, 1) self.layout.addWidget(self.exhasut_fan, 4, 0) self.layout.addWidget(self.intake_fan, 4, 1) self.layout.addWidget(self.start_button, 5, 0) self.layout.addWidget(self.timer_button, 5, 1) # self.layout.addWidget(qp,6,1) def update_temperature(self): self.temp_set.display(str(self.temp_dial.sliderPosition())) try: self.start_button.setEnabled(True) self.Temp.stop() except: '''do nothing here''' def maintain_temperature(self): self.Temp = temp_operation(self) self.start_button.setDisabled(True) self.Temp.isRunning = False time.sleep(1) if self.Temp.isRunning == False: self.Temp.isRunning = True self.Temp.set_temp = self.temp_dial.sliderPosition() self.Temp.display_update.connect(self.temp_display.display) self.Temp.start() print(self.Temp.isRunning)
class GUI(QMainWindow): FRAME_WIDTH = 700 FRAME_HEIGHT = 600 FRAME_BORDER = 20 def __init__(self, config_man: ConfigManager, updater: Updater): super(GUI, self).__init__() self._config_man = config_man self._updater = updater self._subreddit_list = QListWidget() self._subreddit_text_field = QLineEdit() self._subreddit_add_btn = QPushButton() self._subreddit_del_btn = QPushButton() self._filter_text_field = QLineEdit() self._filter_add_btn = QPushButton() self._filter_del_btn = QPushButton() self._filt_rb_include = QRadioButton("Include") self._filt_rb_exclude = QRadioButton("Exclude") self._filter_phrase_list = QListWidget() self._sound_checkbox = CheckBox("Sound", self._sound_notify) self._popup_checkbox = CheckBox("Popup", self._popup_notify) self._notification_checkboxes = [self._sound_checkbox, self._popup_checkbox] self._update_button = QPushButton("Update") self._notification_sound = QSound(self._config_man.properties['notification_sound_path']) self._thread_list = QListWidget() self._status_bar = QStatusBar() self._last_updated_label = QLabel() self._refresh_rate_select = QComboBox() self._popup = None self._init_properties() self._init_layout() self._init_bindings() def _init_layout(self): self.setBaseSize(self.FRAME_WIDTH, self.FRAME_HEIGHT) self.setGeometry(QRect(100, 100, self.FRAME_WIDTH, self.FRAME_HEIGHT)) self._subreddit_list.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Preferred) self._subreddit_text_field.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Fixed) self._subreddit_add_btn.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) self._subreddit_del_btn.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) self._filter_text_field.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Fixed) self._filter_add_btn.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) self._filter_del_btn.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) self._filt_rb_include.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) self._filt_rb_exclude.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) self._filter_phrase_list.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Preferred) for checkbox in self._notification_checkboxes: checkbox.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Fixed) self._refresh_rate_select.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Fixed) self._update_button.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Fixed) subreddit_box = QHBoxLayout() subreddit_box.addWidget(self._subreddit_text_field) subreddit_box.addWidget(self._subreddit_add_btn) subreddit_box.addWidget(self._subreddit_del_btn) filter_box = QHBoxLayout() filter_box.addWidget(self._filter_text_field) filter_box.addWidget(self._filter_add_btn) filter_box.addWidget(self._filter_del_btn) refresh_rate_box = QHBoxLayout() label = QLabel("Refresh rate") label.setFixedSize(70, 20) refresh_rate_box.addWidget(label) refresh_rate_box.addWidget(self._refresh_rate_select) refresh_rate_box.addSpacing(5) label = QLabel("mins") label.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Fixed) refresh_rate_box.addWidget(label) option_box = QVBoxLayout() label = QLabel("Subreddits") label.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) option_box.addWidget(label) option_box.addWidget(self._subreddit_list) option_box.addItem(subreddit_box) option_box.addSpacing(self.FRAME_BORDER) label = QLabel("Filter phrases") label.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) option_box.addWidget(label) option_box.addWidget(self._filter_phrase_list) option_box.addItem(filter_box) option_box.addWidget(self._filt_rb_include) option_box.addWidget(self._filt_rb_exclude) option_box.addSpacing(self.FRAME_BORDER) for checkbox in self._notification_checkboxes: option_box.addWidget(checkbox) option_box.addSpacing(self.FRAME_BORDER) option_box.addItem(refresh_rate_box) option_box.addSpacing(self.FRAME_BORDER) option_box.addWidget(self._update_button) self._thread_list.setSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.MinimumExpanding) self._thread_list.setIconSize(QSize(200, 200)) self._thread_list.setVerticalScrollMode(QAbstractItemView.ScrollPerPixel) self._subreddit_list.setSelectionMode(QAbstractItemView.ExtendedSelection) self._filter_phrase_list.setSelectionMode(QAbstractItemView.ExtendedSelection) self._thread_list.setSelectionMode(QAbstractItemView.NoSelection) hbox = QHBoxLayout() hbox.addItem(option_box) hbox.addWidget(self._thread_list) main = QWidget() main.setLayout(hbox) self.setCentralWidget(main) self.setStatusBar(self._status_bar) self._status_bar.addWidget(self._last_updated_label) def _init_bindings(self): self._updater.updater_task.update.connect(self.update_reddit_posts) self._update_button.clicked.connect(self.update_reddit_posts) self._subreddit_text_field.returnPressed.connect(self._add_subreddit) self._filter_add_btn.pressed.connect(self._add_filter_phrase) self._filter_text_field.returnPressed.connect(self._add_filter_phrase) self._filter_del_btn.pressed.connect(self._del_filter_phrase) self._subreddit_add_btn.clicked.connect(self._add_subreddit) self._subreddit_del_btn.clicked.connect(self._del_subreddit) self._sound_checkbox.stateChanged.connect(lambda state: self._config_man.set('sound_notify', state)) self._popup_checkbox.stateChanged.connect(lambda state: self._config_man.set('popup_notify', state)) self._filt_rb_include.toggled.connect(self._change_filter_mode) self._filt_rb_exclude.toggled.connect(self._change_filter_mode) self._refresh_rate_select.currentIndexChanged.connect(lambda rate: self._updater.set_refresh_rate((rate+1)*60)) def _init_properties(self): for sub in self._config_man.properties['subreddits']: self._subreddit_list.addItem(QListWidgetItem(sub.lower())) for phrase in self._config_man.properties['filter_phrases']: self._filter_phrase_list.addItem(QListWidgetItem(phrase)) if self._config_man.properties['filter_mode'] == 'exclude': self._filt_rb_exclude.setChecked(True) else: self._filt_rb_include.setChecked(True) checked = True if self._config_man.properties['sound_notify'] == 2 else False self._sound_checkbox.setChecked(checked) checked = True if self._config_man.properties['popup_notify'] == 2 else False self._popup_checkbox.setChecked(checked) self._last_updated_label.setText("last updated: " + time.strftime("%d/%m/%y %I:%M%p", time.localtime(self._config_man.properties['last_updated']))) self._subreddit_add_btn.setIcon(QIcon("../resources/add_button.png")) self._subreddit_del_btn.setIcon(QIcon("../resources/del_button.png")) self._filter_add_btn.setIcon(QIcon("../resources/add_button.png")) self._filter_del_btn.setIcon(QIcon("../resources/del_button.png")) for i in range(1, 61): self._refresh_rate_select.addItem(str(i)) self._refresh_rate_select.setCurrentText(str(self._config_man.properties['refresh_rate']//60)) def update_reddit_posts(self): try: new_threads = self._updater.update() for thread in new_threads: item = ThreadItem(thread) self._thread_list.addItem(item.stub) self._thread_list.setItemWidget(item.stub, item.delegate) self._thread_list.scrollToBottom() if len(new_threads) != 0: for checkbox in self._notification_checkboxes: checkbox.execute_if_checked() self._last_updated_label.setText("last updated: " + time.strftime("%d/%m/%y %I:%M%p", time.localtime())) except UpdaterException: pass def _add_subreddit(self): entry = self._subreddit_text_field.text().lower().replace(" ", "") if not self._config_man.properties['subreddits'].__contains__(entry) and entry != "": self._subreddit_list.addItem(QListWidgetItem(entry)) self._config_man.properties['subreddits'].append(entry) self._subreddit_text_field.clear() def _add_filter_phrase(self): entry = self._filter_text_field.text().lower() if not self._config_man.properties['filter_phrases'].__contains__(entry) and entry != "": self._filter_phrase_list.addItem(QListWidgetItem(entry)) self._config_man.properties['filter_phrases'].append(entry) self._filter_text_field.clear() def _del_subreddit(self): items = self._subreddit_list.selectedItems() for item in items: row = self._subreddit_list.row(item) self._subreddit_list.takeItem(row) try: self._config_man.properties['subreddits'].remove(item.text()) except ValueError: pass def _del_filter_phrase(self): items = self._filter_phrase_list.selectedItems() for item in items: row = self._filter_phrase_list.row(item) self._filter_phrase_list.takeItem(row) try: self._config_man.properties['filter_phrases'].remove(item.text()) except ValueError: pass def closeEvent(self, a0): self._config_man.save() def _sound_notify(self): if self._config_man.properties['notification_sound_path'] == "": winsound.MessageBeep() else: self._notification_sound.play() def _popup_notify(self): self._popup = QMessageBox(QMessageBox.NoIcon, "Reddit Monitor", "") self._popup.show() self._popup.setWindowState(self._popup.windowState() & ~Qt.WindowMinimized | Qt.WindowActive) self._popup.activateWindow() def _change_filter_mode(self): if self._filt_rb_exclude.isChecked(): self._config_man.set('filter_mode', 'exclude') else: self._config_man.set('filter_mode', 'include')
class QUnFrameWindow(QWidget): """ 无边框窗口类 """ def __init__(self): super(QUnFrameWindow, self).__init__(None, Qt.FramelessWindowHint) # 设置为顶级窗口,无边框 self._padding = 5 # 设置边界宽度为5 self.hour = 0 self.minute = 1 self.sldHour = QSlider(Qt.Horizontal) self.sldHour.setMinimum(0) self.sldHour.setMaximum(72) self.sldHour.setSingleStep(1) self.sldMinute = QSlider(Qt.Horizontal) self.sldMinute.setMinimum(1) self.sldMinute.setMaximum(60) self.sldMinute.setSingleStep(1) self.sldMinute.setValue(1) self.label = QLabel("00:01") self.label.setStyleSheet( "QLabel{color:rgb(0,0,0,255);font-size:50px;font-weight:normal;font-family:Arial;}" ) self.cb = QRadioButton("执行") self.cb.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) self.cb.toggled.connect(self.openChange) self.sldHour.valueChanged.connect(self.updateHour) self.sldMinute.valueChanged.connect(self.updateMinute) self.initTitleLabel() # 安放标题栏标签 #self.setWindowTitle = self._setTitleText(self.setWindowTitle) # 用装饰器将设置WindowTitle名字函数共享到标题栏标签上 # self.setWindowTitle() self.initLayout() # 设置框架布局 self.setFixedWidth(300) self.setFixedHeight(140) self.setMouseTracking(True) # 设置widget鼠标跟踪 self.initDrag() # 设置鼠标跟踪判断默认值 def updateTime(self): self.label.setText(str(self.hour) + ":" + str(self.minute)) def updateHour(self): print("hour %s" % self.sldHour.value()) self.hour = self.sldHour.value() self.updateTime() def updateMinute(self): print("minute %s" % self.sldMinute.value()) self.minute = self.sldMinute.value() self.updateTime() def openChange(self, state): CREATE_NO_WINDOW = 0x08000000 if state == True: print("open") subprocess.call("shutdown -s -t " + str(self.hour * 3600 + self.minute * 60), creationflags=CREATE_NO_WINDOW) else: print("close") subprocess.call('shutdown -a', creationflags=CREATE_NO_WINDOW) def initDrag(self): # 设置鼠标跟踪判断扳机默认值 self._move_drag = False self._corner_drag = False self._bottom_drag = False self._right_drag = False def initTitleLabel(self): # 安放标题栏标签 self._TitleLabel = QTitleLabel(self) self._TitleLabel.setMouseTracking( True) # 设置标题栏标签鼠标跟踪(如不设,则标题栏内在widget上层,无法实现跟踪) self._TitleLabel.setIndent(10) # 设置标题栏文本缩进 self._TitleLabel.move(0, 0) # 标题栏安放到左上角 def initLayout(self): # 设置框架布局 self._MainLayout = QVBoxLayout() self._MainLayout.setSpacing(0) self._MainLayout.addWidget( QLabel(), Qt.AlignLeft) # 顶一个QLabel在竖放框架第一行,以免正常内容挤占到标题范围里 self._MainLayout.addStretch() # hlayout = QHBoxLayout() hlayout.addWidget(self.label) hlayout.addWidget(self.cb) self._MainLayout.addLayout(hlayout) self._MainLayout.addWidget(self.sldHour) self._MainLayout.addWidget(self.sldMinute) # self.setLayout(self._MainLayout) def addLayout(self, QLayout): # 给widget定义一个addLayout函数,以实现往竖放框架的正确内容区内嵌套Layout框架 self._MainLayout.addLayout(QLayout) # def _setTitleText(self, func): # 设置标题栏标签的装饰器函数 # def wrapper(*args): # self._TitleLabel.setText(*args) # return func(*args) #return wrapper def setTitleAlignment(self, alignment): # 给widget定义一个setTitleAlignment函数,以实现标题栏标签的对齐方式设定 self._TitleLabel.setAlignment(alignment | Qt.AlignVCenter) def setCloseButton(self, bool): # 给widget定义一个setCloseButton函数,为True时设置一个关闭按钮 if bool == True: self._CloseButton = QTitleButton(b'\xef\x81\xb2'.decode("utf-8"), self) self._CloseButton.setObjectName( "CloseButton") # 设置按钮的ObjectName以在qss样式表内定义不同的按钮样式 self._CloseButton.setToolTip("关闭窗口") self._CloseButton.setMouseTracking( True) # 设置按钮鼠标跟踪(如不设,则按钮在widget上层,无法实现跟踪) self._CloseButton.setFixedHeight( self._TitleLabel.height()) # 设置按钮高度为标题栏高度 self._CloseButton.clicked.connect(self.close) # 按钮信号连接到关闭窗口的槽函数 def setMinMaxButtons(self, bool): # 给widget定义一个setMinMaxButtons函数,为True时设置一组最小化最大化按钮 if bool == True: self._MinimumButton = QTitleButton(b'\xef\x80\xb0'.decode("utf-8"), self) self._MinimumButton.setObjectName( "MinMaxButton") # 设置按钮的ObjectName以在qss样式表内定义不同的按钮样式 self._MinimumButton.setToolTip("最小化") self._MinimumButton.setMouseTracking( True) # 设置按钮鼠标跟踪(如不设,则按钮在widget上层,无法实现跟踪) self._MinimumButton.setFixedHeight( self._TitleLabel.height()) # 设置按钮高度为标题栏高度 self._MinimumButton.clicked.connect( self.showMinimized) # 按钮信号连接到最小化窗口的槽函数 self._MaximumButton = QTitleButton(b'\xef\x80\xb1'.decode("utf-8"), self) self._MaximumButton.setObjectName( "MinMaxButton") # 设置按钮的ObjectName以在qss样式表内定义不同的按钮样式 self._MaximumButton.setToolTip("最大化") self._MaximumButton.setMouseTracking( True) # 设置按钮鼠标跟踪(如不设,则按钮在widget上层,无法实现跟踪) self._MaximumButton.setFixedHeight( self._TitleLabel.height()) # 设置按钮高度为标题栏高度 self._MaximumButton.clicked.connect( self._changeNormalButton) # 按钮信号连接切换到恢复窗口大小按钮函数 def _changeNormalButton(self): # 切换到恢复窗口大小按钮 try: self.showMaximized() # 先实现窗口最大化 self._MaximumButton.setText( b'\xef\x80\xb2'.decode("utf-8")) # 更改按钮文本 self._MaximumButton.setToolTip("恢复") # 更改按钮提示 self._MaximumButton.disconnect() # 断开原本的信号槽连接 self._MaximumButton.clicked.connect( self._changeMaxButton) # 重新连接信号和槽 except: pass def _changeMaxButton(self): # 切换到最大化按钮 try: self.showNormal() self._MaximumButton.setText(b'\xef\x80\xb1'.decode("utf-8")) self._MaximumButton.setToolTip("最大化") self._MaximumButton.disconnect() self._MaximumButton.clicked.connect(self._changeNormalButton) except: pass def resizeEvent(self, QResizeEvent): # 自定义窗口调整大小事件 self._TitleLabel.setFixedWidth(self.width()) # 将标题标签始终设为窗口宽度 # 分别移动三个按钮到正确的位置 try: self._CloseButton.move(self.width() - self._CloseButton.width(), 0) except: pass try: self._MinimumButton.move( self.width() - (self._CloseButton.width() + 1) * 3 + 1, 0) except: pass try: self._MaximumButton.move( self.width() - (self._CloseButton.width() + 1) * 2 + 1, 0) except: pass # 重新调整边界范围以备实现鼠标拖放缩放窗口大小,采用三个列表生成式生成三个列表 self._right_rect = [ QPoint(x, y) for x in range(self.width() - self._padding, self.width() + 1) for y in range(1, self.height() - self._padding) ] self._bottom_rect = [ QPoint(x, y) for x in range(1, self.width() - self._padding) for y in range(self.height() - self._padding, self.height() + 1) ] self._corner_rect = [ QPoint(x, y) for x in range(self.width() - self._padding, self.width() + 1) for y in range(self.height() - self._padding, self.height() + 1) ] def mousePressEvent(self, event): # 重写鼠标点击的事件 if (event.button() == Qt.LeftButton) and (event.pos() in self._corner_rect): # 鼠标左键点击右下角边界区域 self._corner_drag = True event.accept() elif (event.button() == Qt.LeftButton) and (event.pos() in self._right_rect): # 鼠标左键点击右侧边界区域 self._right_drag = True event.accept() elif (event.button() == Qt.LeftButton) and (event.pos() in self._bottom_rect): # 鼠标左键点击下侧边界区域 self._bottom_drag = True event.accept() elif (event.button() == Qt.LeftButton) and (event.y() < self._TitleLabel.height()): # 鼠标左键点击标题栏区域 self._move_drag = True self.move_DragPosition = event.globalPos() - self.pos() event.accept() def mouseMoveEvent(self, QMouseEvent): # 判断鼠标位置切换鼠标手势 if QMouseEvent.pos() in self._corner_rect: self.setCursor(Qt.SizeFDiagCursor) elif QMouseEvent.pos() in self._bottom_rect: self.setCursor(Qt.SizeVerCursor) elif QMouseEvent.pos() in self._right_rect: self.setCursor(Qt.SizeHorCursor) else: self.setCursor(Qt.ArrowCursor) # 当鼠标左键点击不放及满足点击区域的要求后,分别实现不同的窗口调整 # 没有定义左方和上方相关的5个方向,主要是因为实现起来不难,但是效果很差,拖放的时候窗口闪烁,再研究研究是否有更好的实现 if Qt.LeftButton and self._right_drag: # 右侧调整窗口宽度 self.resize(QMouseEvent.pos().x(), self.height()) QMouseEvent.accept() elif Qt.LeftButton and self._bottom_drag: # 下侧调整窗口高度 self.resize(self.width(), QMouseEvent.pos().y()) QMouseEvent.accept() elif Qt.LeftButton and self._corner_drag: # 右下角同时调整高度和宽度 self.resize(QMouseEvent.pos().x(), QMouseEvent.pos().y()) QMouseEvent.accept() elif Qt.LeftButton and self._move_drag: # 标题栏拖放窗口位置 self.move(QMouseEvent.globalPos() - self.move_DragPosition) QMouseEvent.accept() def mouseReleaseEvent(self, QMouseEvent): # 鼠标释放后,各扳机复位 self._move_drag = False self._corner_drag = False self._bottom_drag = False self._right_drag = False
class MainWindow(QMainWindow): def __init__(self, parent=None): super(MainWindow, self).__init__(parent) self.init_widgets() self.init_UI() self.init_connection() def init_widgets(self): self.Display_Widget = Display_widget() def init_UI(self): self.setWindowIcon(QIcon("GUI-resourses/FT-icon.png")) self.setWindowTitle("FT-ITK 简易三维医学数据可视化平台") self.main_widget = QtWidgets.QWidget() # 创建窗口主部件 self.main_layout = QtWidgets.QGridLayout() # 创建主部件的网格布局 #self.main_widget.setObjectName('main_widget') self.setCentralWidget(self.main_widget) # 设置窗口主部件 self.main_widget.setLayout(self.main_layout) #self.setLayout(self.main_layout) # 设置窗口主部件布局为网格布局 self.left_widget = QtWidgets.QWidget() # 创建窗口左部件 self.left_layout = QtWidgets.QGridLayout() self.left_widget.setLayout(self.left_layout) self.main_layout.addWidget(self.left_widget, 0, 0) self.main_layout.addWidget(self.Display_Widget, 0, 1) self.left_treewidget = Drop_Tree_Widget(self.left_widget) self.left_layout.addWidget(self.left_treewidget, 0, 0, 20, 10) self.left_pbar_container_widget = QtWidgets.QWidget(self.left_widget) self.pbar = QProgressBar(self.left_widget) self.model_btn = QRadioButton(self.left_widget) self.model_btn.setText("Seg") self.left_layout.addWidget(self.pbar, 21, 1, 1, 9) self.left_layout.addWidget(self.model_btn, 21, 0, 1, 1) self.left_layout.setSpacing(20) # self.left_layout.addWidget(self.left_pbar_container_widget) # self.left_treewidget.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self.pbar.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed) self.model_btn.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) #self.left_pbar_container_widget.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) # self.left_pbar_container_layout= QtWidgets.QHBoxLayout() # self.left_pbar_container_widget.setLayout(self.left_pbar_container_layout) # self.left_pbar_container_layout.addWidget(self.pbar) # self.model_btn=SwitchBtn(self.left_pbar_container_widget) # self.left_pbar_container_layout.addWidget(self.model_btn) #self.pbar.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) def init_connection(self): self.left_treewidget.file_text_signal.connect(self.handle_drop_file) self.model_btn.toggled.connect(self.handle_model_btn_clicked) self.Display_Widget.pbar_signal.connect(self.progress_bar_effect) def handle_drop_file(self, file_path: str): """ activated when a file is dropped into treewidget :param file_path: the path of the dropped file :return: """ self.Display_Widget.load_data(file_path=file_path) if self.model_btn.isChecked(): #do segmentation self.Display_Widget.load_label_data() self.Display_Widget.flash() else: pass def handle_model_btn_clicked(self): if self.model_btn.isChecked() == True: #do segmentation self.Display_Widget.load_label_data() self.Display_Widget.flash() else: self.pbar.setValue(0) self.Display_Widget.clear_label() self.Display_Widget.flash() def FixSize(self): self.setFixedSize(self.width(), self.height()) def progress_bar_effect(self): # just for show for i in range(100): self.pbar.setValue(i + 1) time.sleep(0.01)