class TitleBar(QWidget): # Сигнал минимизации окна windowMinimumed = Signal() # увеличить максимальный сигнал окна windowMaximumed = Signal() # сигнал восстановления окна windowNormaled = Signal() # сигнал закрытия окна windowClosed = Signal() # Окно мобильных windowMoved = Signal(QPoint) # Сигнал Своя Кнопка +++ signalButtonMy = Signal() def __init__(self, *args, **kwargs): super(TitleBar, self).__init__(*args, **kwargs) # Поддержка настройки фона qss self.setAttribute(Qt.WA_StyledBackground, True) self.mPos = None self.iconSize = 20 # Размер значка по умолчанию # Установите цвет фона по умолчанию, иначе он будет прозрачным из-за влияния родительского окна self.setAutoFillBackground(True) palette = self.palette() palette.setColor(palette.Window, QColor(240, 240, 240)) self.setPalette(palette) # Подключение стиля self.setStyleSheet('Titlebar.qss') self.setStyleSheet(open("Titlebar.qss", "r").read()) # макет layout = QHBoxLayout(self) layout.setSpacing(0) layout.setContentsMargins(0, 0, 0, 0) # значок окна # название окна self.titleLabel = QLabel(self) self.titleLabel.setMargin(2) self.font_id = QFontDatabase.addApplicationFont( "Roboto/Roboto-Bold.ttf") font = QFont("Roboto-Bold", 12) font.setFamily(u"Roboto") font.setBold(True) self.buttonMy = QPushButton(self, clicked=self.showButtonMy, objectName='buttonMy') self.buttonMy.setIcon(QIcon('icon-white.ico')) layout.addWidget(self.buttonMy) layout.addStretch() self.titleLabel.setFont(font) layout.addStretch() layout.addWidget(self.titleLabel, alignment=Qt.AlignCenter) # Средний телескопический бар layout.addSpacerItem( QSpacerItem(40, 100, QSizePolicy.Expanding, QSizePolicy.Minimum)) # Использовать шрифты Webdings для отображения значков font = self.font() or QFont() font.setFamily('Webdings') # Своя Кнопка # Свернуть кнопку self.buttonMinimum = QPushButton('0', self, clicked=self.windowMinimumed.emit, font=font, objectName='buttonMinimum') layout.addWidget(self.buttonMinimum) # Кнопка Max / restore self.buttonMaximum = QPushButton('1', self, clicked=self.showMaximized, font=font, objectName='buttonMaximum') layout.addWidget(self.buttonMaximum) # Кнопка закрытия self.buttonClose = QPushButton('r', self, clicked=self.windowClosed.emit, font=font, objectName='buttonClose') layout.addWidget(self.buttonClose) # начальная высота self.setHeight() # +++ Вызывается по нажатию кнопки buttonMy def showButtonMy(self): print("Своя Кнопка ") self.signalButtonMy.emit() def showMaximized(self): if self.buttonMaximum.text() == '1': # Максимизировать self.buttonMaximum.setText('2') self.windowMaximumed.emit() else: # Восстановить self.buttonMaximum.setText('1') self.windowNormaled.emit() def setHeight(self, height=38): """ Установка высоты строки заголовка """ self.setMinimumHeight(height) self.setMaximumHeight(height) # Задайте размер правой кнопки ? self.buttonMinimum.setMinimumSize(height, height) self.buttonMinimum.setMaximumSize(height, height) self.buttonMaximum.setMinimumSize(height, height) self.buttonMaximum.setMaximumSize(height, height) self.buttonClose.setMinimumSize(height, height) self.buttonClose.setMaximumSize(height, height) self.buttonMy.setMinimumSize(height, height) self.buttonMy.setMaximumSize(height, height) def setTitle(self, title): """ Установить заголовок """ self.titleLabel.setText(title) def setIcon(self, icon): """ настройки значокa """ self.iconLabel.setPixmap(icon.pixmap(self.iconSize, self.iconSize)) def setIconSize(self, size): """ Установить размер значка """ self.iconSize = size def enterEvent(self, event): self.setCursor(Qt.ArrowCursor) super(TitleBar, self).enterEvent(event) def mouseDoubleClickEvent(self, event): super(TitleBar, self).mouseDoubleClickEvent(event) self.showMaximized() def mousePressEvent(self, event): """ Событие клика мыши """ if event.button() == Qt.LeftButton: self.mPos = event.pos() event.accept() def mouseReleaseEvent(self, event): ''' Событие отказов мыши ''' self.mPos = None event.accept() def mouseMoveEvent(self, event): if event.buttons() == Qt.LeftButton and self.mPos: self.windowMoved.emit(self.mapToGlobal(event.pos() - self.mPos)) event.accept()
def abandon(self, value: QPushButton): if value.text().lower().count('yes'): self.game.abandon = self.game.player self.updateView()
def proposeDraw(self, value: QPushButton): if value.text().lower().count('yes'): self.game.draw = True self.updateView()
class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("Hooty Light Client") self.program_started = False self.log_text_box = QPlainTextEdit(self) self.log_text_box.setReadOnly(True) self.url = self.get_url_config() self.edit_url = QLineEdit(self.url) self.run_button = QPushButton("Run Hooty!") widgy = QWidget() layout = QVBoxLayout() widgy.setLayout(layout) layout.addWidget(self.log_text_box) layout.addWidget(self.edit_url) layout.addWidget(self.run_button) self.setLayout(layout) self.setCentralWidget(widgy) self.thread_pool = QThreadPool() # Create a runner self.runner = runner.JobRunner(self.edit_url.text()) self.thread_pool.start(self.runner) self.runner.logHandler.log.signal.connect(self.write_log) # Run some actions when we press the hooty button! self.run_button.pressed.connect( lambda: self.runner.set_url(self.edit_url.text())) self.run_button.pressed.connect( lambda: self.write_url_config(self.edit_url.text())) self.run_button.pressed.connect(self.runner.clicked) self.run_button.pressed.connect(self.hooty_button_text) self.show() # Get the url from the config file if it is there def get_url_config(self): config = configparser.ConfigParser() if path.exists("hooty.ini"): try: config.read("hooty.ini") return config['DEFAULT']['url'] except: return "url.example" else: return "url.example" # Write your url to the file! # TODO: Maybe I should only write if the url is a valid working one.. def write_url_config(self, url): config = configparser.ConfigParser() config['DEFAULT'] = {'url': url} with open('hooty.ini', 'w') as configfile: config.write(configfile) # Change some text! # TODO: Something something variables def hooty_button_text(self): if self.run_button.text() == "Run Hooty!": self.run_button.setText("Hooty is running!") else: self.run_button.setText("Run Hooty!") # First time we run our actual worker thread # No reason to run it immediately def run_thread(self): # Thread runner if self.program_started is False: self.thread_pool.start(self.runner) # Make sure we actually kill the worker def closeEvent(self, event): self.runner.exit() # writing to our log & scroll to the bottom @Slot(str) def write_log(self, log_text): self.log_text_box.appendPlainText(log_text) self.log_text_box.centerCursor()