精华内容
下载资源
问答
  • pyqt Mainwindow自带的标题栏和菜单栏不能修改,看了很多博客也没有写完整的自定义标题栏和菜单栏的方法,探索了一番后实现了,记录一下,以供参考 实现方法,隐藏Mianwindow原来的标题栏,创建QDockWidget停靠于...

    pyqt Mainwindow自带的标题栏和菜单栏不能修改,看了很多博客也没有写完整的自定义标题栏和菜单栏的方法,探索了一番后实现了,记录一下,以供参考

    实现方法,隐藏Mianwindow原来的标题栏,创建QDockWidget停靠于Mainwindow顶部,在QDockWidget中使用垂直布局添加两个widget,对两个widget分别设置实现标题栏和工具栏

    下面是实现代码

    Mainwindow:

    import sys
    from TitleBar import *
    import sys
    from PyQt5.QtCore import *
    from PyQt5.QtWidgets import *
    from PyQt5.QtGui import *
    from default import *
    
    class MainWindow(QMainWindow):
        def __init__(self):
            super(MainWindow, self).__init__()
            self.InitializeWindow()
    
        def InitializeWindow(self):
            self.setWindowFlags(Qt.FramelessWindowHint)
            self.setMinimumSize(WINDOW_DEFAULT_WIDTH, WINDOW_DEFAULT_HEIGHT)
            self.InitializeViews()
            self.setStyleSheet(str(self.LoadStyleFromQss(WINDOW_QSS)))
    
        def InitializeViews(self):
            self.title_meun_dock = QDockWidget('', self)
            self.title_meun_dock.setAllowedAreas(Qt.TopDockWidgetArea)
            #self.title_meun_dock.setMinimumSize(QSize(1000, 60))
            #self.title_meun_dock.setMaximumSize(QSize(1000, 60))
            self.title_meun_dock.setFixedHeight(50)
            self.title_meun_dock.setTitleBarWidget(QWidget()) 
            self.addDockWidget(Qt.TopDockWidgetArea, self.title_meun_dock)
            self.titleBar = TitleBar(self)
            #self.client = QWidget(self)
            self.menuBar = MeunBar(self)
            self.menuBar.setStyleSheet(self.meun_bar_qss())
            
            self.center = QWidget(self)
    
            #self.setCentralWidget(self.center)
    
            self.lay = QVBoxLayout(self)
            self.center.setLayout(self.lay)
    
            self.lay.addWidget(self.titleBar)
            self.lay.addWidget(self.menuBar)
            #self.lay.addWidget(self.client)
            
            self.lay.setStretch(1, 1280)
            self.lay.setSpacing(0)
            self.lay.setContentsMargins(0, 0, 0, 0)
    
            self.titleBar.SetIcon(QPixmap(WINDOW_ICON))
            self.titleBar.SetTitle('annble')
    
            self.title_meun_dock.setWidget(self.center)
    
        def LoadStyleFromQss(self, f):
            file = open(f)
            lines = file.readlines()
            file.close()
            res = ''
            for line in lines:
                res += line
    
            return res
        def meun_bar_qss(self):
            meun_bar_qss = "QWidget{\n" \
            "    background:rgb(255,41,59);\n" \
            "}"
    
            return meun_bar_qss
    
    
    if __name__ == '__main__':
        app = QApplication(sys.argv)
    
        win = MainWindow()
        win.show()
    
        sys.exit(app.exec_())
        pass
    

    标题栏和菜单栏设置代码

    import sys
    from PyQt5.QtCore import *
    from PyQt5.QtWidgets import *
    from PyQt5.QtGui import *
    from default import *
    
    class TitleBar(QWidget):
        def __init__(self, parent):
            super(TitleBar, self).__init__(parent)
            self.win = parent
            self.InitializeWindow()
    
        def InitializeWindow(self):
            self.isPressed = False
            self.setFixedHeight(TITLE_BAR_HEIGHT)
            self.InitializeViews()
            pass
    
        def InitializeViews(self):
            self.iconLabel = QLabel(self)
            self.titleLabel = QLabel(self)
    
            self.minButton = QPushButton(self)
            self.restoreButton = QPushButton(self)
            self.closeButton = QPushButton(self)
    
            self.minButton.setFixedSize(TITLE_BUTTON_SIZE, TITLE_BUTTON_SIZE);
            self.restoreButton.setFixedSize(TITLE_BUTTON_SIZE, TITLE_BUTTON_SIZE);
            self.closeButton.setFixedSize(TITLE_BUTTON_SIZE, TITLE_BUTTON_SIZE);
    
            self.iconLabel.setFixedSize(TITLE_LABEL_SIZE, TITLE_LABEL_SIZE);
            self.titleLabel.setFixedHeight(TITLE_LABEL_SIZE);
    
            self.iconLabel.setAlignment(Qt.AlignCenter);
            self.titleLabel.setAlignment(Qt.AlignCenter);
    
            self.minButton.setIcon(QIcon(TITLE_MIN_ICON));
            self.restoreButton.setIcon(QIcon(TITLE_RESTORE_ICON));
            self.closeButton.setIcon(QIcon(TITLE_CLS_ICON));
    
            self.minButton.clicked.connect(self.ShowMininizedWindow)
            self.restoreButton.clicked.connect(self.ShowRestoreWindow)
            self.closeButton.clicked.connect(self.CloseWindow)
    
            self.lay = QHBoxLayout(self)
            self.setLayout(self.lay)
    
            self.lay.setSpacing(0)
            self.lay.setContentsMargins(0, 0, 0, 0)
    
            self.lay.addWidget(self.iconLabel)
            self.lay.addWidget(self.titleLabel)
            self.lay.addWidget(self.minButton)
            self.lay.addWidget(self.restoreButton)
            self.lay.addWidget(self.closeButton)
    
        def ShowMininizedWindow(self):
            self.win.showMinimized()
    
        def ShowMaximizedWindow(self):
            self.win.showMaximized()
    
        def ShowRestoreWindow(self):
            if self.win.isMaximized():
                self.win.showNormal()
            else:
                self.win.showMaximized()
    
        def CloseWindow(self):
            self.win.close()
    
        def SetTitle(self, str):
            self.titleLabel.setText(str)
    
        def SetIcon(self, pix):
            self.iconLabel.setPixmap(pix.scaled(self.iconLabel.size() - QSize(TITLE_ICON_MAG, TITLE_ICON_MAG)))
    
        def mouseDoubleClickEvent(self, event):
            self.ShowRestoreWindow()
            return QWidget().mouseDoubleClickEvent(event)
    
        def mousePressEvent(self, event):
            self.isPressed = True
            self.startPos = event.globalPos()
            return QWidget().mousePressEvent(event)
    
        def mouseReleaseEvent(self, event):
            self.isPressed = False
            return QWidget().mouseReleaseEvent(event)
    
        def mouseMoveEvent(self, event):
            if self.isPressed:
                if self.win.isMaximized:
                    self.win.showNormal()
    
                movePos = event.globalPos() - self.startPos
                self.startPos = event.globalPos()
                self.win.move(self.win.pos() + movePos)
    
            return QWidget().mouseMoveEvent(event)
    
    class MeunBar(QMenuBar):
        def __init__(self, parent):
            super(MeunBar, self).__init__(parent)
            self.win = parent
            self.InitializeWindow()
    
        def InitializeWindow(self):
            self.isPressed = False
            self.setFixedHeight(25)
            #self.setGeometry(0, 25, 100, 25)
            #self.InitializeViews()
            pass
    
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        win = TitleBar(None)
        win.show()
        sys.exit(app.exec_())
        pass
    

    参数设置

    RES_PATH = '本地路径'
    
    #MainWindow
    WINDOW_QSS = RES_PATH + "theme.qss"
    WINDOW_ICON = RES_PATH + "win.png"
    WINDOW_TITLE = "测试窗口"
    
    WINDOW_DEFAULT_WIDTH = 640
    WINDOW_DEFAULT_HEIGHT = 480
    
    #title bar
    TITLE_BAR_HEIGHT = 25
    TITLE_BUTTON_SIZE = 25
    TITLE_LABEL_SIZE = 25
    TITLE_BUTTON_WIDTH = 25
    TITLE_BUTTON_HEIGHT = 25
    TITLE_ICON_MAG = 10
    
    
    TITLE_MIN_ICON = RES_PATH + "min.png"
    TITLE_CLS_ICON = RES_PATH + "exit.png"
    TITLE_RESTORE_ICON = RES_PATH + "restore.png"

    参考文档

    一时找不到了,找到 了再添加

    展开全文
  • 代码说明(1)主窗口(2)标题栏(3)完整代码(4)美化(QSS)3.源代码链接 1. 简述   这几天给老师做项目用到了PyQt5,说一些自己的想法,用python写qt界面我觉得如果懂C++和Qt是最好的,因为PyQt5没有相应的官方文档,我...

    1. 简述

      这几天给老师做项目用到了PyQt5,说一些自己的想法,用python写qt界面我觉得如果懂C++和Qt是最好的,因为PyQt5没有相应的官方文档,我做项目时都是对照着Qt的C++文档做的,而且二者基本差别不大,只是一些小细节有略微不同而已,当然不懂Qt直接做也可以,但是这难免很费劲。
      废话就说这些,下面就稍微说下Qt界面美化,后面附有C++和python的代码链接,下面是效果图:
    在这里插入图片描述

    2.代码说明

      做这个自定义的标题栏,主要实现以下几个功能:

    1. 关闭,最小化,复原三个按钮的基本功能;
    2. 双击标题栏窗口最大化或者缩小;
    3. 鼠标点击拖动窗口;
    4. 显示标题和图标

    (1)主窗口

      先说一下主界面的代码,主要就是两行:

    	self.setWindowFlags(Qt.FramelessWindowHint)		#隐藏主窗口边界
    	self.lay.setSpacing(0);							#去除控件间的距离
    	self.lay.setContentsMargins(0, 0, 0, 0)
    

      这里的self就是主窗口QMainWindow,lay就是一个QVBoxLayout的布局,使用参数Qt.FramelessWindowHint可以让主窗口不现实边框,只显示客户区,我们就可以自己绘制标题栏的内容。
      下面两行设为0是为了取消控件之间的间距,不这样的话很难设置空间的布局,会使得窗口很丑。
      主窗口还有一个就是SetStyleSheet就是设置界面的样式,这个后面再说。

    (2)标题栏

      标题栏主要包含五个空间两个label:图标label、标题label,三个按钮:最小化按钮、复原按钮和关闭按钮。三个按钮分别通过connect链接下面几个槽即可。另外代码中的self.win是主窗口的引用,如果使用self.window()获取的有些时候无法准确的获取到对应的值而使得功能失效,我这里选择用一个变量保存来进行操作,当然也可以通过另外两种方式:

    1. 通过信号槽将鼠标事件发送出去
    2. 通过实践过滤器eventFliter在主窗口中为标题栏Widget安装事件进一步处理。

      我这里有个小问题,因为self.win是用来存放主界面的,因此标题栏窗口不能独立的存在,如果强行将主窗口设为None创建的话,窗口能显示但是最大化等功能不能执行,这个可以自行修改,这到不难,判断下win是否为None,是的话对本窗口操作即可。

    	#最小化窗口
    	def ShowMininizedWindow(self):
            self.win.showMinimized()
    	
    	#最大化窗口
        def ShowMaximizedWindow(self):
            self.win.showMaximized()
    
    	#复原窗口
        def ShowRestoreWindow(self):
            if self.win.isMaximized():
                self.win.showNormal()
            else:
                self.win.showMaximized()
    
    	#关闭窗口
        def CloseWindow(self):
            self.win.close()
    

      事件触发,鼠标单击、双击和移动的事件。

    	def mouseDoubleClickEvent(self, event):
            self.ShowRestoreWindow()
            return QWidget().mouseDoubleClickEvent(event)
    
        def mousePressEvent(self, event):
            self.isPressed = True
            self.startPos = event.globalPos()	#记录鼠标点击的位置
            return QWidget().mousePressEvent(event)
    
        def mouseReleaseEvent(self, event):
            self.isPressed = False
            return QWidget().mouseReleaseEvent(event)
    
        def mouseMoveEvent(self, event):
            if self.isPressed:
                if self.win.isMaximized:
                    self.win.showNormal()
                    
    			#计算窗口应该移动的距离
                movePos = event.globalPos() - self.startPos
                self.startPos = event.globalPos()
                self.win.move(self.win.pos() + movePos)
    
            return QWidget().mouseMoveEvent(event)
    

    (3)完整代码

      代码中的图标,等一下参数是我自己定义的,可以在最后的源代码中查看。

    	import sys
    from PyQt5.QtCore import *
    from PyQt5.QtWidgets import *
    from PyQt5.QtGui import *
    from default import *
    
    class TitleBar(QWidget):
        def __init__(self, parent):
            super(TitleBar, self).__init__()
            self.win = parent
            self.InitializeWindow()
    
        def InitializeWindow(self):
            self.isPressed = False
            self.setFixedHeight(TITLE_BAR_HEIGHT)
            self.InitializeViews()
            pass
    
        def InitializeViews(self):
            self.iconLabel = QLabel(self)
            self.titleLabel = QLabel(self)
    
            self.minButton = QPushButton(self)
            self.restoreButton = QPushButton(self)
            self.closeButton = QPushButton(self)
    
            self.minButton.setFixedSize(TITLE_BUTTON_SIZE, TITLE_BUTTON_SIZE);
            self.restoreButton.setFixedSize(TITLE_BUTTON_SIZE, TITLE_BUTTON_SIZE);
            self.closeButton.setFixedSize(TITLE_BUTTON_SIZE, TITLE_BUTTON_SIZE);
    
            self.iconLabel.setFixedSize(TITLE_LABEL_SIZE, TITLE_LABEL_SIZE);
            self.titleLabel.setFixedHeight(TITLE_LABEL_SIZE);
    
            self.iconLabel.setAlignment(Qt.AlignCenter);
            self.titleLabel.setAlignment(Qt.AlignCenter);
    
            self.minButton.setIcon(QIcon(TITLE_MIN_ICON));
            self.restoreButton.setIcon(QIcon(TITLE_RESTORE_ICON));
            self.closeButton.setIcon(QIcon(TITLE_CLS_ICON));
    
            self.minButton.clicked.connect(self.ShowMininizedWindow)
            self.restoreButton.clicked.connect(self.ShowRestoreWindow)
            self.closeButton.clicked.connect(self.CloseWindow)
    
            self.lay = QHBoxLayout(self)
            self.setLayout(self.lay)
    
            self.lay.setSpacing(0)
            self.lay.setContentsMargins(0, 0, 0, 0)
    
            self.lay.addWidget(self.iconLabel)
            self.lay.addWidget(self.titleLabel)
            self.lay.addWidget(self.minButton)
            self.lay.addWidget(self.restoreButton)
            self.lay.addWidget(self.closeButton)
    
        def ShowMininizedWindow(self):
            self.win.showMinimized()
    
        def ShowMaximizedWindow(self):
            self.window.showMaximized()
    
        def ShowRestoreWindow(self):
            if self.win.isMaximized():
                self.win.showNormal()
            else:
                self.win.showMaximized()
    
        def CloseWindow(self):
            self.win.close()
    
        def SetTitle(self, str):
            self.titleLabel.setText(str)
    
        def SetIcon(self, pix):
            self.iconLabel.setPixmap(pix.scaled(self.iconLabel.size() - QSize(TITLE_ICON_MAG, TITLE_ICON_MAG)))
    
        def mouseDoubleClickEvent(self, event):
            self.ShowRestoreWindow()
            return QWidget().mouseDoubleClickEvent(event)
    
        def mousePressEvent(self, event):
            self.isPressed = True
            self.startPos = event.globalPos()
            return QWidget().mousePressEvent(event)
    
        def mouseReleaseEvent(self, event):
            self.isPressed = False
            return QWidget().mouseReleaseEvent(event)
    
        def mouseMoveEvent(self, event):
            if self.isPressed:
                if self.win.isMaximized:
                    self.win.showNormal()
    
                movePos = event.globalPos() - self.startPos
                self.startPos = event.globalPos()
                self.win.move(self.win.pos() + movePos)
    
            return QWidget().mouseMoveEvent(event)
    
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        win = TitleBar(None)
        win.show()
        sys.exit(app.exec_())
        pass
    

    (4)美化(QSS)

      Qss是Qt的界面样式,直接挪用Qt的就可以,官方参考地址:QSS Help
      颜色是从Visual Studio中取的。

    QWidget
    {
        background-color:#313034;
        color:#f1f1f1;
        font-size:12px;
        border:2px solid #423f48;
        font: "Tlwg Typo";
        margin:0px;
    
    }
    
    QMainWindow
    {
    }
    
    QPushButton
    {
        border:none;
        width:35px;
    }
    
    QPushButton:hover
    {
        background-color:#423f48;
    }
    
    QPushButton:pressed
    {
        background-color:#444444;
    }
    
    QLabel
    {
        background-color:#2A292B;
        border:none;
    }
    

    3.源代码链接

      里面有C++的和Python的代码,C++的使用Visual Studio+Qt写的。
      源代码链接

    展开全文
  • python PyQt5自定义标题栏

    千次阅读 2019-02-24 10:32:15
    from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import * import sys # 按钮高度 BUTTON_HEIGHT = 30 ...# 标题栏高度 TITLE_HEIGHT = 30 class TitleWidget(QWidget)...

    python PyQt5自定义标题栏

    from PyQt5.QtCore import *
    from PyQt5.QtGui import *
    from PyQt5.QtWidgets import *
    import sys
    
    # 按钮高度
    BUTTON_HEIGHT = 30
    # 按钮宽度
    BUTTON_WIDTH = 30
    # 标题栏高度
    TITLE_HEIGHT = 30
    
    
    class TitleWidget(QWidget):
        def __init__(self):
            super().__init__()
            # self.setStyleSheet("background-color:blue")
            titleIcon = QPixmap(".\icon.png")
            Icon = QLabel()
            Icon.setPixmap(titleIcon.scaled(25, 25))
            titleContent = QLabel("标题内容")
            titleContent.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)
            titleContent.setFixedHeight(TITLE_HEIGHT)
            titleContent.setObjectName("TitleContent")
            self.ButtonMin = QPushButton()
            self.ButtonMin.setFixedSize(QSize(BUTTON_WIDTH, BUTTON_HEIGHT))
            self.ButtonMin.setObjectName("ButtonMin")
            self.ButtonMax = QPushButton()
            self.ButtonMax.setFixedSize(QSize(BUTTON_WIDTH, BUTTON_HEIGHT))
            self.ButtonMax.setObjectName("ButtonMax")
            self.ButtonRestore = QPushButton()
            self.ButtonRestore.setFixedSize(QSize(BUTTON_WIDTH, BUTTON_HEIGHT))
            self.ButtonRestore.setObjectName("ButtonRestore")
            self.ButtonRestore.setVisible(False)
            self.ButtonClose = QPushButton()
            self.ButtonClose.setFixedSize(QSize(BUTTON_WIDTH, BUTTON_HEIGHT))
            self.ButtonClose.setObjectName("ButtonClose")
            mylayout = QHBoxLayout()
            mylayout.setSpacing(0)
            mylayout.setContentsMargins(0, 0, 0, 0)
            mylayout.addWidget(Icon)
    
            mylayout.addWidget(titleContent)
            mylayout.addWidget(self.ButtonMin)
            mylayout.addWidget(self.ButtonMax)
            mylayout.addWidget(self.ButtonRestore)
            mylayout.addWidget(self.ButtonClose)
    
            self.setLayout(mylayout)
            # QSS可写在文件中 读文件使用 这里方便大家使用直接写在代码里吧
            Qss = '''
    
                QLabel#TitleContent
                {
                    color: #FFFFFF;
                }
    
                QPushButton#ButtonMin
                {
                    border-image:url(./min.png) 0 81 0 0 ;
    
                }
    
                QPushButton#ButtonMin:hover
                {
                    border-image:url(./min.png) 0 54 0 27 ;
                }
    
                QPushButton#ButtonMin:pressed
                {
                    border-image:url(./min.png) 0 27 0 54 ;
                }
    
                QPushButton#ButtonMax
                {
                    border-image:url(./max.png) 0 81 0 0 ;
                }
    
                QPushButton#ButtonMax:hover
                {
                    border-image:url(./max.png) 0 54 0 27 ;
                }
    
                QPushButton#ButtonMax:pressed
                {
                    border-image:url(./max.png) 0 27 0 54 ;
                }
    
                QPushButton#ButtonRestore
                {
                    border-image:url(./restore.png) 0 81 0 0 ;
                }
    
                QPushButton#ButtonRestore:hover
                {
                    border-image:url(./restore.png) 0 54 0 27 ;
                }
    
                QPushButton#ButtonRestore:pressed
                {
                    border-image:url(./restore.png) 0 27 0 54 ;
                }
    
                QPushButton#ButtonClose
                {
                    border-image:url(./close.png) 0 81 0 0 ;
                    border-top-right-radius:3 ;
                }
    
                QPushButton#ButtonClose:hover
                {
                    border-image:url(./close.png) 0 54 0 27 ;
                    border-top-right-radius:3 ;
                }
    
                QPushButton#ButtonClose:pressed
                {
                    border-image:url(./close.png) 0 27 0 54 ;
                    border-top-right-radius:3 ;
                }
    
            '''
            self.setStyleSheet(Qss)
    
            self.restorePos = None
            self.restoreSize = None
            self.startMovePos = None
    
        def saveRestoreInfo(self, point, size):
            self.restorePos = point
            self.restoreSize = size
    
        def getRestoreInfo(self):
            return self.restorePos, self.restoreSize
    
    
    class MainWindow(QMainWindow):
        def __init__(self):
            super().__init__()
            self.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowMinimizeButtonHint)
            self.resize(800, 600)
            AllWidget = QWidget()
            # AllWidget.setStyleSheet("background-color:red")
            Alllayout = QVBoxLayout()
            Alllayout.setSpacing(0)
            Alllayout.setContentsMargins(0, 0, 0, 0)
            AllWidget.setLayout(Alllayout)
            self.title = TitleWidget()
            self.title.setFixedWidth(self.width())
            self.title.setFixedHeight(TITLE_HEIGHT)
            self.title.ButtonMin.clicked.connect(self.ButtonMinSlot)
            self.title.ButtonMax.clicked.connect(self.ButtonMaxSlot)
            self.title.ButtonRestore.clicked.connect(self.ButtonRestoreSlot)
            self.title.ButtonClose.clicked.connect(self.ButtonCloseSlot)
            centerWidget = QWidget()
            # centerWidget 中可以随意添加自己想用的控件
            # centerWidget.setStyleSheet("background-color:red")
            Qss = '''
                QMainWindow{
                    background:qlineargradient(spread:pad,x1:1,y1:0,x2:0,y2:1,stop:0 rgba(51,146,255,255),stop:1 rgba(255,255,255,255));  
    
                }
            '''
    
            Alllayout.addWidget(self.title)
            Alllayout.addWidget(centerWidget)
            self.setCentralWidget(AllWidget)
            self.setStyleSheet(Qss)
    
        def ButtonMinSlot(self):
            self.showMinimized()
    
        def ButtonMaxSlot(self):
            self.title.ButtonMax.setVisible(False)
            self.title.ButtonRestore.setVisible(True)
            self.title.saveRestoreInfo(self.pos(), QSize(self.width(), self.height()))
            desktopRect = QApplication.desktop().availableGeometry()
            FactRect = QRect(desktopRect.x() - 3, desktopRect.y() - 3, desktopRect.width() + 6, desktopRect.height() + 6)
            print(FactRect)
            self.setGeometry(FactRect)
            self.setFixedSize(desktopRect.width() + 6, desktopRect.height() + 6)
    
        def ButtonRestoreSlot(self):
            self.title.ButtonMax.setVisible(True)
            self.title.ButtonRestore.setVisible(False)
            windowPos, windowSize = self.title.getRestoreInfo()
            # print(windowPos,windowSize.width(),windowSize.height())
            self.setGeometry(windowPos.x(), windowPos.y(), windowSize.width(), windowSize.height())
            self.setFixedSize(windowSize.width(), windowSize.height())
    
        def ButtonCloseSlot(self):
            self.close()
    
        def paintEvent(self, event):
            self.title.setFixedWidth(self.width())
    
    
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        mw = MainWindow()
        mw.show()
        sys.exit(app.exec_())
    

    centerWidget 中可以在空白部分 添加自己想要的控件
    代码中的最大化最小化关闭按钮 可以使用 控件移动后续更新
    代码效果

    程序效果程序效果

    参考 https://www.jianshu.com/p/1b91fd2beb85 这篇文章 大佬使用C的Qt实现的 我使用的图片也来自这篇博客

    图片资源
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    图片路径大家自己定哈

    展开全文
  • PyQt5 自定义标题栏,实现无边框,最小化最大化关闭事件,窗口拖动移动,窗口改变大小,仿百度网盘色调美化 文章目录PyQt5 自定义标题栏,实现无边框,最小化最大化关闭事件,窗口拖动移动,窗口改变大小,仿百度...

    PyQt5 自定义标题栏,实现无边框,最小化最大化关闭事件,窗口拖动移动,窗口改变大小,仿百度网盘色调美化



    1.实现效果

    image-20200811102036797


    文件框架

    |

    |-TitleTest.py ui代码

    |

    |-CallTitleTest.py 逻辑代码

    |


    2. Qtdesigner设计(ui设计代码)

    设计图:

    image-20200811103450609

    布局

    image-20200810211955145

    具体控件设置请看 ui的py文件

    请留意 3 个pushButton和 2 个lable的大小设计

    TitleTest.py

    # -*- coding: utf-8 -*-
    
    # Form implementation generated from reading ui file 'TitleTest.ui'
    #
    # Created by: PyQt5 UI code generator 5.13.0
    #
    # WARNING! All changes made in this file will be lost!
    
    
    from PyQt5 import QtCore, QtGui, QtWidgets
    
    
    class Ui_Form(object):
        def setupUi(self, Form):
            Form.setObjectName("Form")
            Form.resize(648, 432)
            self.verticalLayout = QtWidgets.QVBoxLayout(Form)
            self.verticalLayout.setContentsMargins(0, 0, 0, 0)
            self.verticalLayout.setSpacing(0)
            self.verticalLayout.setObjectName("verticalLayout")
            self.widget = QtWidgets.QWidget(Form)
            self.widget.setMaximumSize(QtCore.QSize(16777215, 35))
            self.widget.setObjectName("widget")
            self.horizontalLayout = QtWidgets.QHBoxLayout(self.widget)
            self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
            self.horizontalLayout.setSpacing(0)
            self.horizontalLayout.setObjectName("horizontalLayout")
            spacerItem = QtWidgets.QSpacerItem(5, 20, QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Minimum)
            self.horizontalLayout.addItem(spacerItem)
            self.label = QtWidgets.QLabel(self.widget)
            sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
            sizePolicy.setHorizontalStretch(20)
            sizePolicy.setVerticalStretch(20)
            sizePolicy.setHeightForWidth(self.label.sizePolicy().hasHeightForWidth())
            self.label.setSizePolicy(sizePolicy)
            self.label.setMaximumSize(QtCore.QSize(20, 20))
            self.label.setObjectName("label")
            self.horizontalLayout.addWidget(self.label)
            spacerItem1 = QtWidgets.QSpacerItem(5, 20, QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Minimum)
            self.horizontalLayout.addItem(spacerItem1)
            self.label_2 = QtWidgets.QLabel(self.widget)
            sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
            sizePolicy.setHorizontalStretch(0)
            sizePolicy.setVerticalStretch(30)
            sizePolicy.setHeightForWidth(self.label_2.sizePolicy().hasHeightForWidth())
            self.label_2.setSizePolicy(sizePolicy)
            self.label_2.setObjectName("label_2")
            self.horizontalLayout.addWidget(self.label_2)
            spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
            self.horizontalLayout.addItem(spacerItem2)
            self.pushButton = QtWidgets.QPushButton(self.widget)
            sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
            sizePolicy.setHorizontalStretch(20)
            sizePolicy.setVerticalStretch(20)
            sizePolicy.setHeightForWidth(self.pushButton.sizePolicy().hasHeightForWidth())
            self.pushButton.setSizePolicy(sizePolicy)
            self.pushButton.setMinimumSize(QtCore.QSize(0, 0))
            self.pushButton.setMaximumSize(QtCore.QSize(20, 20))
            self.pushButton.setObjectName("pushButton")
            self.horizontalLayout.addWidget(self.pushButton)
            spacerItem3 = QtWidgets.QSpacerItem(8, 20, QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Minimum)
            self.horizontalLayout.addItem(spacerItem3)
            self.pushButton_2 = QtWidgets.QPushButton(self.widget)
            sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
            sizePolicy.setHorizontalStretch(20)
            sizePolicy.setVerticalStretch(20)
            sizePolicy.setHeightForWidth(self.pushButton_2.sizePolicy().hasHeightForWidth())
            self.pushButton_2.setSizePolicy(sizePolicy)
            self.pushButton_2.setMaximumSize(QtCore.QSize(20, 20))
            self.pushButton_2.setObjectName("pushButton_2")
            self.horizontalLayout.addWidget(self.pushButton_2)
            spacerItem4 = QtWidgets.QSpacerItem(8, 20, QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Minimum)
            self.horizontalLayout.addItem(spacerItem4)
            self.pushButton_3 = QtWidgets.QPushButton(self.widget)
            sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
            sizePolicy.setHorizontalStretch(20)
            sizePolicy.setVerticalStretch(20)
            sizePolicy.setHeightForWidth(self.pushButton_3.sizePolicy().hasHeightForWidth())
            self.pushButton_3.setSizePolicy(sizePolicy)
            self.pushButton_3.setMaximumSize(QtCore.QSize(20, 20))
            self.pushButton_3.setObjectName("pushButton_3")
            self.horizontalLayout.addWidget(self.pushButton_3)
            spacerItem5 = QtWidgets.QSpacerItem(5, 20, QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Minimum)
            self.horizontalLayout.addItem(spacerItem5)
            self.verticalLayout.addWidget(self.widget)
            self.widget_2 = QtWidgets.QWidget(Form)
            self.widget_2.setObjectName("widget_2")
            self.verticalLayout.addWidget(self.widget_2)
    
            self.retranslateUi(Form)
            QtCore.QMetaObject.connectSlotsByName(Form)
    
        def retranslateUi(self, Form):
            _translate = QtCore.QCoreApplication.translate
            Form.setWindowTitle(_translate("Form", "Form"))
            self.label.setText(_translate("Form", "图标"))
            self.label_2.setText(_translate("Form", "TextLabel"))
            self.pushButton.setToolTip(_translate("Form", "<html><head/><body><p>最小化</p></body></html>"))
            self.pushButton.setText(_translate("Form", "-"))
            self.pushButton_2.setToolTip(_translate("Form", "<html><head/><body><p>最大化</p></body></html>"))
            self.pushButton_2.setText(_translate("Form", "O"))
            self.pushButton_3.setToolTip(_translate("Form", "<html><head/><body><p>关闭</p></body></html>"))
            self.pushButton_3.setText(_translate("Form", "X"))
    

    3. 设置无边框,标题和图标

    完整的逻辑代码请看最下面的CallTitleTest.py文件代码

    单独设置一个函数来整理无边框,标题和图标设置_init_main_window,如果全部放在__init__初始化函数里,会很混乱的

    def _init_main_window(self):
        # 设置窗体无边框
        self.setWindowFlags(Qt.FramelessWindowHint)
        # 设置背景透明
        self.setAttribute(Qt.WA_TranslucentBackground)
    
        ########在测试时记得设置自己的图标地址
        # 设置图标
        w = self.label.width()
        h = self.label.height()
        self.pix = QPixmap(r"D:\code_python\CalPx_test\images\481ee7d90dfcc5c5418eaa8bf94370f2_cr.jpg")  # 注意修改Windows路径问题
        self.label.setPixmap(self.pix)
        self.label.setScaledContents(True)
    
        # 设置标题
        self.label_2.setText('我的APP')
        # 设置标题字体,大小
        self.label_2.setStyleSheet('''
                                    font-family:"方正胖娃_GBK";
                                   font-size:11px;
                                   ''')
    

    ########在测试时记得设置自己的图标地址

    我是用两个 QLable 标签控件来放置图标和标题的,用QSS进行一定美化

    进行读写文件时,在字符串前加 r,u,b,f 的含义

    要在__init__初始化函数里初始化函数

    self. _init_main_window() 
    

    4.最大化最小化关闭事件

    最大化最小化关闭事件是通过三个按钮来实现

    编写三个按钮的信号与槽函数

    def _close_max_min_icon(self):
        self.pushButton_3.setText('r')
        self.pushButton_2.setText('1')
        self.pushButton.setText('0')
    
    @pyqtSlot()
    def on_pushButton_clicked(self):
        # 最小化
        self.showMinimized()
    
    @pyqtSlot()
    def on_pushButton_2_clicked(self):
        # 最大化与复原
        if self.isMaximized():
            self.showNormal()
            self.pushButton_2.setText('1')  # 切换放大按钮图标字体
            self.pushButton_2.setToolTip("<html><head/><body><p>最大化</p></body></html>")
        else:
            self.showMaximized()
            self.pushButton_2.setText('2')
            self.pushButton_2.setToolTip("<html><head/><body><p>恢复</p></body></html>")
    
    @pyqtSlot()
    def on_pushButton_3_clicked(self):
        # 关闭程序
        self.close()
    

    def _close_max_min_icon(self):函数不是按钮的信号与槽函数,在这里说是因为它是设置三个按钮的图标关键字,使用了 webdings字体,需要在__init__初始化

    PyQt5 使用 webdings,Wingdings 字体来替代某些常用图片

    5.窗口拖动移动,窗口改变大小

    __init__初始化函数里声明代码并初始化一些函数

    self._initDrag()  # 设置鼠标跟踪判断扳机默认值
    
    self.setMouseTracking(True)  # 设置widget鼠标跟踪
    self.widget.installEventFilter(self)  # 初始化事件过滤器
    self.widget_2.installEventFilter(self)
    
    

    事件过滤器函数

    def eventFilter(self, obj, event):
        # 事件过滤器,用于解决鼠标进入其它控件后还原为标准鼠标样式
        if isinstance(event, QEnterEvent):
            self.setCursor(Qt.ArrowCursor)
        return super(MyWindow, self).eventFilter(obj, event)  # 注意 ,MyWindow是所在类的名称
        # return QWidget.eventFilter(self, obj, event)  # 用这个也行,但要注意修改窗口类型
    

    因为设置了主窗口透明化,所以要专门用这个过滤器来恢复鼠标形状,两个子窗口widgetwidget_2都要经过这个过滤器

    鼠标事件

    def resizeEvent(self, QResizeEvent):
        # 自定义窗口调整大小事件
        # 改变窗口大小的三个坐标范围
        self._right_rect = [QPoint(x, y) for x in range(self.width() - 5, self.width() + 5)
                            for y in range(self.widget.height() + 20, self.height() - 5)]
        self._bottom_rect = [QPoint(x, y) for x in range(1, self.width() - 5)
                             for y in range(self.height() - 5, self.height() + 1)]
        self._corner_rect = [QPoint(x, y) for x in range(self.width() - 5, self.width() + 1)
                             for y in range(self.height() - 5, 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.widget.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:  # QMouseEvent.pos()获取相对位置
            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)
    
        # 当鼠标左键点击不放及满足点击区域的要求后,分别实现不同的窗口调整
        # 没有定义左方和上方相关的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
    

    def resizeEvent(self, QResizeEvent)通过这个函数获取改变大小的坐标范围,只有鼠标处于这个范围,就可以改变程序窗口大小。

    我只设置了三个方向可以改变窗口大小,其他的可以自行修改。

    坐标问题:

    self.width()获取主窗口的宽,self.height()获取主窗口的高

    相对应的self.widget.width()是获取子窗口widget的宽

    event.pos()QMouseEvent.pos()获取相对于软件窗口的像素坐标

    event.globalPos()QMouseEvent.globalPos()获取相对于屏幕的像素坐标

    后面的x,y分别是其的x坐标和y坐标

    6.仿百度网盘色调QSS美化

    设置背景色

    image-20200811111430871

    百度网盘程序的标题栏的颜色便灰,内容窗口便白色,使用屏幕拾色器获取具体颜色编码。

    两款屏幕取色拾色器(免安装,1MB左右大小)

    QSS代码

    QWidget#widget{background-color:#eef0f6;
    border-left:0.5px solid lightgray;
    border-right:0.5px solid lightgray;
    border-top:0.5px solid lightgray;
    border-bottom:0.5px solid #e5e5e5;
    border-top-left-radius: 5px;
    border-top-right-radius: 5px;
    }
    
    QWidget#widget_2{background-color:#ffffff;
    border-left:0.5px solid lightgray;
     border-right:0.5px solid lightgray;
    border-bottom:0.5px solid #e5e5e5;
    border-bottom-left-radius: 5px;
    border-bottom-right-radius: 5px;
    padding:5px 5px 5px 5px
    }
    

    美化三个按钮

    QSS代码

    QPushButton#pushButton
    {
    font-family:"Webdings";
    text-align:top;
    background:#6DDF6D;border-radius:5px;
    border:none;
    font-size:13px;
    }
    QPushButton#pushButton:hover{background:green;}
    
    QPushButton#pushButton_2
    {
    font-family:"Webdings";
    background:#F7D674;border-radius:5px;
    border:none;
    font-size:13px;
    }
    QPushButton#pushButton_2:hover{background:yellow;}
    
    QPushButton#pushButton_3
    {
    font-family:"Webdings";
    background:#F76677;border-radius:5px;
    border:none;
    font-size:13px;
    }
    QPushButton#pushButton_3:hover{background:red;}
    

    7.完整逻辑代码 CallTitleTest.py

    CallTitleTest.py

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    # author:mgboy time:2020/8/5
    import sys
    
    from PyQt5.QtCore import pyqtSlot, Qt, QPoint
    from PyQt5.QtGui import QFont, QEnterEvent, QPixmap
    from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QDialog
    from PyQt5 import QtCore
    
    from TitleTest import Ui_Form
    
    
    class MyWindow(QWidget, Ui_Form):
        def __init__(self, parent=None):
            super(MyWindow, self).__init__(parent)
            self.setupUi(self)
            self._init_main_window()  # 主窗口初始化设置
    
            self._initDrag()  # 设置鼠标跟踪判断扳机默认值
            self.setMouseTracking(True)  # 设置widget鼠标跟踪
            self._close_max_min_icon()  # 设置 3 个按钮的图标字体
            print(self.width(),self.height())
            self.my_Qss()  # 美化
            self.widget.installEventFilter(self)  # 初始化事件过滤器
            self.widget_2.installEventFilter(self)
    
        def _init_main_window(self):
            # 设置窗体无边框
            self.setWindowFlags(Qt.FramelessWindowHint)
            # 设置背景透明
            self.setAttribute(Qt.WA_TranslucentBackground)
    
            ########在测试时记得设置自己的图标地址
            # 设置图标
            w = self.label.width()
            h = self.label.height()
            self.pix = QPixmap(r"D:\code_python\CalPx_test\images\481ee7d90dfcc5c5418eaa8bf94370f2_cr.jpg")  # 注意修改Windows路径问题
            self.label.setPixmap(self.pix)
            self.label.setScaledContents(True)
    
            # 设置标题
            self.label_2.setText('我的APP')
            # 设置标题字体,大小
            self.label_2.setStyleSheet('''
                                        font-family:"方正胖娃_GBK";
                                       font-size:11px;
                                       ''')
    
        def _initDrag(self):
            # 设置鼠标跟踪判断扳机默认值
            self._move_drag = False
            self._corner_drag = False
            self._bottom_drag = False
            self._right_drag = False
    
        def _close_max_min_icon(self):
            # 设置按钮图标使用webdings特殊字体
            self.pushButton_3.setText('r')
            self.pushButton_2.setText('1')
            self.pushButton.setText('0')
    
        @pyqtSlot()
        def on_pushButton_clicked(self):
            # 最小化
            self.showMinimized()
    
        @pyqtSlot()
        def on_pushButton_2_clicked(self):
            # 最大化与复原
            if self.isMaximized():
                self.showNormal()
                self.pushButton_2.setText('1')  # 切换放大按钮图标
                self.pushButton_2.setToolTip("<html><head/><body><p>最大化</p></body></html>")
            else:
                self.showMaximized()
                self.pushButton_2.setText('2')
                self.pushButton_2.setToolTip("<html><head/><body><p>恢复</p></body></html>")
    
        @pyqtSlot()
        def on_pushButton_3_clicked(self):
            # 关闭程序
            self.close()
    
        def eventFilter(self, obj, event):
            # 事件过滤器,用于解决鼠标进入其它控件后还原为标准鼠标样式
            if isinstance(event, QEnterEvent):
                self.setCursor(Qt.ArrowCursor)
            return super(MyWindow, self).eventFilter(obj, event)  # 注意 ,MyWindow是所在类的名称
            # return QWidget.eventFilter(self, obj, event)  # 用这个也行,但要注意修改窗口类型
    
        def resizeEvent(self, QResizeEvent):
            # 自定义窗口调整大小事件
            # 改变窗口大小的三个坐标范围
            self._right_rect = [QPoint(x, y) for x in range(self.width() - 5, self.width() + 5)
                                for y in range(self.widget.height() + 20, self.height() - 5)]
            self._bottom_rect = [QPoint(x, y) for x in range(1, self.width() - 5)
                                 for y in range(self.height() - 5, self.height() + 1)]
            self._corner_rect = [QPoint(x, y) for x in range(self.width() - 5, self.width() + 1)
                                 for y in range(self.height() - 5, 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.widget.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:  # QMouseEvent.pos()获取相对位置
                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)
    
            # 当鼠标左键点击不放及满足点击区域的要求后,分别实现不同的窗口调整
            # 没有定义左方和上方相关的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
    
        def my_Qss(self):
            # Qss美化
            qssStyle = '''
                        
                       QWidget#widget{
                       background-color:#eef0f6;
                       border-left:0.5px solid lightgray;
                       border-right:0.5px solid lightgray;
                       border-top:0.5px solid lightgray;
                       border-bottom:0.5px solid #e5e5e5;
                       border-top-left-radius: 5px;
                       border-top-right-radius: 5px;
                       }
                       
                       QWidget#widget_2{
                       background-color:#ffffff;
                       border-left:0.5px solid lightgray;
                        border-right:0.5px solid lightgray;
                       border-bottom:0.5px solid #e5e5e5;
                       border-bottom-left-radius: 5px;
                       border-bottom-right-radius: 5px;
                       padding:5px 5px 5px 5px
                       }
                       
                       QPushButton#pushButton
                       {
                       font-family:"Webdings";
                       text-align:top;
                       background:#6DDF6D;border-radius:5px;
                       border:none;
                       font-size:13px;
                       }
                       QPushButton#pushButton:hover{background:green;}
                       
                       QPushButton#pushButton_2
                       {
                       font-family:"Webdings";
                       background:#F7D674;border-radius:5px;
                       border:none;
                       font-size:13px;
                       }
                       QPushButton#pushButton_2:hover{background:yellow;}
                       
                       QPushButton#pushButton_3
                       {
                       font-family:"Webdings";
                       background:#F76677;border-radius:5px;
                       border:none;
                       font-size:13px;
                       }
                       QPushButton#pushButton_3:hover{background:red;}
                       '''
            self.setStyleSheet(qssStyle)
    
    
    
    if __name__ == "__main__":
        # 适配2k等高分辨率屏幕,低分辨率屏幕可以缺省
        QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
        app = QApplication(sys.argv)
        myWin = MyWindow()
        myWin.show()
        sys.exit(app.exec_())
    

    .

    .

    要加入其它控件,可以先使用designer设计一个QWidget类窗口,再加入widget_2子窗口即可。最近会写一下怎么加。设计时要注意widget_2子窗口的大小是648*397,最好按照这个大小再来设计。也可以把标题类设置为一个接口文件,调用即可,不过这要修改逻辑代码。

    .

    .

    .

    .

                  border:none;
                   font-size:13px;
                   }
                   QPushButton#pushButton_3:hover{background:red;}
                   '''
        self.setStyleSheet(qssStyle)
    

    if name == “main”:
    # 适配2k等高分辨率屏幕,低分辨率屏幕可以缺省
    QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
    app = QApplication(sys.argv)
    myWin = MyWindow()
    myWin.show()
    sys.exit(app.exec_())

    
    
    
    .
    
    .
    
    要加入其它控件,可以先使用`designer`设计一个`QWidget`类窗口,再加入`widget_2`子窗口即可。最近会写一下怎么加。设计时要注意`widget_2`子窗口的大小是`648*397`,最好按照这个大小再来设计。也可以把标题类设置为一个接口文件,调用即可,不过这要修改逻辑代码。
    
    .
    
    .
    
    .
    
    .
    
    
    展开全文
  • 【最终版】PyQt5 自定义标题栏,实现无边框,最小化最大化关闭事件,窗口拖动移动,窗口改变大小,仿百度网盘色调美化,添加内容窗口 文章目录【最终版】PyQt5 自定义标题栏,实现无边框,最小化最大化关闭事件,...
  • PyQt 自定义气泡弹窗

    2021-01-30 19:54:36
    PyQt自定义气泡弹窗,可以透明度变化、自动关闭,用于一些动作提示
  • 一、自定义标题栏pyQt中,顶层的窗口会自动添加标题栏: 面向开发者的工具或软件通常使用默认的样式,但是面向用户的软件,则一般会通过自定义标题栏,使软件界面更加富有个性化。这一小节的自定义标题栏的...
  •  隐藏掉系统的控制,实现了自定义标题控制,以及关闭/最大化/最小化的功能,自由调整窗体大小的功能(跟随一个大佬学的),代码内有详细注释  只要把MainWindow类自己实现就可以了,我把左侧的demo(可以...
  • PyQt5 自定义可拖动标题栏 将此段代码加入到我的上一篇博客中即可 实现标题栏的拖动 def getRestoreInfo(self): return self.restorePos, self.restoreSize def mousePressEvent(self, QMouseEvent): self.is...
  • Qt隐藏系统标题栏,使用自定义标题栏

    千次阅读 多人点赞 2020-09-23 18:23:22
    今天我们来实现自定义标题栏的实现,这里面用到了布局,鼠标事件重写等知识点,首先还是自定义标题栏的创作,像下面这样,可放大,可缩小,并且随着窗体大小的改变,控件做自适应调整。有没有感觉狗子的界面做的...
  • Qt 基于QMainWindow自定义标题栏

    千次阅读 2018-05-17 00:23:24
    网上也有很多自定义标题栏的实现,在这里主要讲下怎么把自定义标题栏和QMainWindow怎么结合起来,由于无法获取QMainWindow的布局,所以无法再QMainWindow窗口上加自定义标题栏,要懒重写菜单栏等工具外,可以把...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 531
精华内容 212
关键字:

pyqt自定义标题栏