如何使用 PyQt5 实现自定义标题栏和窗口框架? [复制]

Posted

技术标签:

【中文标题】如何使用 PyQt5 实现自定义标题栏和窗口框架? [复制]【英文标题】:How does one implement a custom title bar and window frame using PyQt5? [duplicate] 【发布时间】:2016-10-14 05:26:27 【问题描述】:

有没有办法使用 Qt Designer 来设计框架和标题栏?

如果是这样,我怎样才能使它与现有代码一起工作?

这是现有的代码:

import sys

from PyQt5 import QtCore, uic
from PyQt5.QtWidgets import QApplication, QDialog


class Actions(QDialog):
    def __init__(self, parent=None):
        QDialog.__init__(self, parent)

        self.ui = uic.loadUi("console_gui.ui")
        self.ui.setWindowFlags(QtCore.Qt.FramelessWindowHint)
        self.ui.show()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = Actions()
    sys.exit(app.exec_())

如果没有,是否有成功使用 FramelessWindowHint 的开源 PyQt5 项目的链接?

PyQt5 没有任何关于这方面的文档。它们只是链接到 C++ 版本。

【问题讨论】:

PS:我在链接问题中添加了 PyQt5 版本。 【参考方案1】:

你可以使用 QPushButtons 和 QHBoxLayout。

class Actions(QDialog):
    def __init__(self, parent=None):
        QDialog.__init__(self, parent)

        self.setWindowFlags(QtCore.Qt.FramelessWindowHint)


        self.resize(500, 600)

        # 
        self.otherFrame = QFrame(self)

        # There are two Buttons and using them custom title bar.
        # We could give them string or pictures.
        self.oneButton = QPushButton('one')
        self.twoButton = QPushButton('two')

        # We must be give them some functions.
        self.oneButton.clicked.connect(self.oneClicked)
        self.twoButton.clicked.connect(self.twoClicked)

        # And some layouts.
        # This is a layout of horizontal.
        # 
        self.layouts = QHBoxLayout()
        # This is a layout of vertical.
        self.layouts2 = QVBoxLayout()

        self.layouts.addWidget(self.oneButton)
        self.layouts.addWidget(self.twoButton)
        self.layouts.addStretch(1)

        self.layouts2.addLayout(self.layouts)
        self.layouts2.addWidget(self.otherFrame)


        self.setLayout(self.layouts2)

        self.show()

    def oneClicked(self):
        print(1)

    def twoClicked(self):
        print(2)



    def mousePressEvent(self, event):

        if event.buttons() == Qt.LeftButton:
            self.m_drag = True
            self.m_DragPosition = event.globalPos()-self.pos()
            event.accept()

    def mouseMoveEvent(self, event):
        try:
            if event.buttons() and Qt.LeftButton:
                self.move(event.globalPos()-self.m_DragPosition)
                event.accept()
        except AttributeError:
            pass

    def mouseReleaseEvent(self, event):
        self.m_drag = False

像这样。

【讨论】:

它似乎没有解决鼠标拖动事件等,但非常感谢。 :) @Daegon Taven 我编辑了它。

以上是关于如何使用 PyQt5 实现自定义标题栏和窗口框架? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

PyQt5学习记录---QMainWindow菜单栏状态栏和工具栏

PyQt5学习--基本窗口控件--QMainWindow

PyQt5 笔记(03):弹出窗口大全

如何使小部件随 PyQt5 中的窗口缩放?

PyQt5快速入门PyQt5高级窗口组件

如何使窗口可拖动(C# Winforms)?