Почему текст не встаёт в нужную точку?

Решил сделать программу с "кастомным" интерфейсом.
Так как нет стандартной рамки Windows, то название программы я решил вставить через QLabel, но я не понимаю почему текст не встаёт в верхний левый угол.

from PyQt5.QtCore import Qt, QSize, QTimer
from PyQt5.QtWidgets import (QDialog, QVBoxLayout, QWidget,
    QGraphicsDropShadowEffect, QPushButton, QGridLayout, QSpacerItem,
    QSizePolicy, QLabel, QApplication)


Stylesheet = """
#Custom_Widget {
    background: #121212;
}
#closeButton {
    min-width: 20px;
    min-height: 20px;
    font-family: "Webdings";
    qproperty-text: "r";
    background-color: #0078f2;
    color: white;
}
#closeButton:hover {
    color: #ccc;
    background: red;
}
#logo {
    color: white;
}
"""


class Dialog(QDialog):

    def __init__(self, *args, **kwargs):
        super(Dialog, self).__init__(*args, **kwargs)
        self.setObjectName('Custom_Dialog')
        self.setWindowFlags(self.windowFlags() | Qt.FramelessWindowHint)
        self.setAttribute(Qt.WA_TranslucentBackground, True)
        self.setStyleSheet(Stylesheet)

        self.initUi()


    def initUi(self):
        self.widget = QWidget(self)
        self.widget.setObjectName('Custom_Widget')
        layout = QVBoxLayout(self)
        layout.addWidget(self.widget)

        layout = QGridLayout(self.widget)
        layout.addItem(QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum), 0, 0)
        layout.addWidget(QPushButton('r', self, clicked=self.accept, objectName='closeButton'), 0, 1)
        layout.addWidget(QLabel("<h2>The program</h2>", objectName='logo'), 0, 0)

    def sizeHint(self):
        return QSize(500, 300)


if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    w = Dialog()
    w.exec_()
    QTimer.singleShot(200, app.quit)
    sys.exit(app.exec_())

Конкретно проблема в строчке

layout.addWidget(QLabel("<h2>The program</h2>", objectName='logo'), 0, 0)

если в координатах первый будет 0, то и кнопка выхода тоже "съедет" со своего места.

Попутно решил спросить, как сделать чтобы окно можно было двигать мышкой, оно вообще не перемещается.


Ответы (1 шт):

Автор решения: S. Nick

Как вариант:

from PyQt5.QtCore import Qt, QSize, QTimer, QPoint
from PyQt5.QtWidgets import (QDialog, QVBoxLayout, QWidget,
    QGraphicsDropShadowEffect, QPushButton, QGridLayout, QSpacerItem,
    QSizePolicy, QLabel, QApplication, QHBoxLayout)


class Dialog(QDialog):                    
    def __init__(self, *args, **kwargs):
        super(Dialog, self).__init__(*args, **kwargs)
        self.setObjectName('Custom_Dialog')
        self.setWindowFlags(self.windowFlags() | Qt.FramelessWindowHint)
        self.setAttribute(Qt.WA_TranslucentBackground, True)

        self.start = QPoint(0, 0)                                 # +
        self.pressing = False                                     # +
        
        self.initUi()


    def initUi(self):
        self.widget = QWidget(self)
        self.widget.setObjectName('Custom_Widget')
        label = QLabel("<h2>The program</h2>", objectName='logo')
        pushButton = QPushButton( 'r', clicked=self.accept, 
            objectName='closeButton', maximumWidth=30)
        layout = QHBoxLayout(self.widget)
        layout.addWidget(label, alignment=Qt.AlignLeft)
        layout.addWidget(pushButton, alignment=Qt.AlignRight)

        self.widget_content = QWidget()
        self.widget_content.setObjectName('Content_Widget')        
        label_2 = QLabel("<h1>Hello World.</h1>", objectName='label_2')
        layout_2 = QGridLayout(self.widget_content)
        layout_2.addWidget(label_2, 0, 0, alignment=Qt.AlignCenter)
        
        main_layout = QVBoxLayout(self)
        main_layout.addWidget(self.widget, alignment=Qt.AlignTop)
        main_layout.addWidget(self.widget_content, stretch=1)
        main_layout.setSpacing(0)
        
    def sizeHint(self):
        return QSize(500, 300)

# + vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
    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.setGeometry(self.mapToGlobal(self.movement).x(),
                                self.mapToGlobal(self.movement).y(),
                                self.width(),
                                self.height())
            self.start = self.end

    def mouseReleaseEvent(self, QMouseEvent):
        self.pressing = False
# + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^


Stylesheet = """
#Custom_Widget {
    background: #334257;
}

#Content_Widget {
    background: #476072;
}

#closeButton {
    min-width: 20px;
    min-height: 20px;
    font-family: "Webdings";
    qproperty-text: "r";
    background-color: #0078f2;
    color: white;
}
#closeButton:hover {
    color: #ccc;
    background: red;
}
#logo {
    color: white;
}
"""


if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    app.setStyleSheet(Stylesheet)                               # +
    w = Dialog()
    w.exec_()
    QTimer.singleShot(200, app.quit)
    sys.exit(app.exec_())

введите сюда описание изображения

→ Ссылка