Exemplo n.º 1
0
    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
Exemplo n.º 2
0
    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)
Exemplo n.º 4
0
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')
Exemplo n.º 5
0
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
Exemplo n.º 6
0
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)