Estoy trabajando en una aplicación de toma de notas mínima compatible con Opendown Markdown para Windows / Linux. Estoy tratando de eliminar la barra de título y agregar mis propios botones. Quiero algo como, una barra de título con solo dos botones personalizados como se muestra en la figura
Actualmente tengo esto:
He intentado modificar las banderas de la ventana:
self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
, la ventana no tiene bordes, pero no puede mover o cambiar el tamaño de la ventana self.setWindowFlags(QtCore.Qt.CustomizeWindowHint)
, la ventana puede cambiar de tamaño pero no se puede mover y tampoco puede deshacerse de la parte blanca en la parte superior de la ventana. Cualquier ayuda apreciada. Puedes encontrar el proyecto en GitHub aquí .
Gracias..
Este es mi código python:
from PyQt5 import QtCore, QtWidgets, QtWebEngineWidgets, uic import sys import os import markdown2 # https://github.com/trentm/python-markdown2 from PyQt5.QtCore import QRect from PyQt5.QtGui import QFont simpleUiForm = uic.loadUiType("Simple.ui")[0] class SimpleWindow(QtWidgets.QMainWindow, simpleUiForm): def __init__(self, parent=None): QtWidgets.QMainWindow.__init__(self, parent) self.setupUi(self) self.markdown = markdown2.Markdown() self.css = open(os.path.join("css", "default.css")).read() self.editNote.setPlainText("") #self.noteView = QtWebEngineWidgets.QWebEngineView(self) self.installEventFilter(self) self.displayNote.setContextMenuPolicy(QtCore.Qt.NoContextMenu) #self.setWindowFlags(QtCore.Qt.FramelessWindowHint) def eventFilter(self, object, event): if event.type() == QtCore.QEvent.WindowActivate: print("widget window has gained focus") self.editNote.show() self.displayNote.hide() elif event.type() == QtCore.QEvent.WindowDeactivate: print("widget window has lost focus") note = self.editNote.toPlainText() htmlNote = self.getStyledPage(note) # print(note) self.editNote.hide() self.displayNote.show() # print(htmlNote) self.displayNote.setHtml(htmlNote) elif event.type() == QtCore.QEvent.FocusIn: print("widget has gained keyboard focus") elif event.type() == QtCore.QEvent.FocusOut: print("widget has lost keyboard focus") return False
El archivo UI se crea en la siguiente jerarquía
Aquí están los pasos que debes seguir:
Aquí hay un pequeño ejemplo con movimientos y botones implementados. Aún debería tener que implementar el cambio de tamaño usando la misma lógica.
import sys from PyQt5.QtCore import QPoint from PyQt5.QtCore import Qt from PyQt5.QtWidgets import QApplication from PyQt5.QtWidgets import QHBoxLayout from PyQt5.QtWidgets import QLabel from PyQt5.QtWidgets import QPushButton from PyQt5.QtWidgets import QVBoxLayout from PyQt5.QtWidgets import QWidget class MainWindow(QWidget): def __init__(self): super(MainWindow, self).__init__() self.layout = QVBoxLayout() self.layout.addWidget(MyBar(self)) self.setLayout(self.layout) self.layout.setContentsMargins(0,0,0,0) self.layout.addStretch(-1) self.setMinimumSize(800,400) self.setWindowFlags(Qt.FramelessWindowHint) self.pressing = False class MyBar(QWidget): def __init__(self, parent): super(MyBar, self).__init__() self.parent = parent print(self.parent.width()) self.layout = QHBoxLayout() self.layout.setContentsMargins(0,0,0,0) self.title = QLabel("My Own Bar") btn_size = 35 self.btn_close = QPushButton("x") self.btn_close.clicked.connect(self.btn_close_clicked) self.btn_close.setFixedSize(btn_size,btn_size) self.btn_close.setStyleSheet("background-color: red;") self.btn_min = QPushButton("-") self.btn_min.clicked.connect(self.btn_min_clicked) self.btn_min.setFixedSize(btn_size, btn_size) self.btn_min.setStyleSheet("background-color: gray;") self.btn_max = QPushButton("+") self.btn_max.clicked.connect(self.btn_max_clicked) self.btn_max.setFixedSize(btn_size, btn_size) self.btn_max.setStyleSheet("background-color: gray;") self.title.setFixedHeight(35) self.title.setAlignment(Qt.AlignCenter) self.layout.addWidget(self.title) self.layout.addWidget(self.btn_min) self.layout.addWidget(self.btn_max) self.layout.addWidget(self.btn_close) self.title.setStyleSheet(""" background-color: black; color: white; """) self.setLayout(self.layout) self.start = QPoint(0, 0) self.pressing = False def resizeEvent(self, QResizeEvent): super(MyBar, self).resizeEvent(QResizeEvent) self.title.setFixedWidth(self.parent.width()) def mousePressEvent(self, event): self.start = self.mapToGlobal(event.pos()) self.pressing = True def mouseMoveEvent(self, event): if self.pressing: self.end = self.mapToGlobal(event.pos()) self.movement = self.end-self.start self.parent.setGeometry(self.mapToGlobal(self.movement).x(), self.mapToGlobal(self.movement).y(), self.parent.width(), self.parent.height()) self.start = self.end def mouseReleaseEvent(self, QMouseEvent): self.pressing = False def btn_close_clicked(self): self.parent.close() def btn_max_clicked(self): self.parent.showMaximized() def btn_min_clicked(self): self.parent.showMinimized() if __name__ == "__main__": app = QApplication(sys.argv) mw = MainWindow() mw.show() sys.exit(app.exec_())
Opción 1:
Opcion 2:
En lugar de tener un QGridLayout, puede detectar en qué lugar está haciendo clic con el clic pos.
Verifique si la x del clic es más pequeña que la x de la posición en movimiento para saber si se está moviendo hacia la izquierda o hacia la derecha y dónde se está haciendo clic.
El cálculo se realiza de la misma manera que la Opción1.
Opción 3:
Consejos:
Buena suerte: D