月下梧桐~ 2023-02-18 12:11 采纳率: 81.8%
浏览 86
已结题

PYQT5界面全屏后关闭按钮消失

PYQT5界面,通过self.showFullScreen() (下面代码块中第15行)全屏显示,为什么界面的关闭按钮会消失!
问题如图:

img


代码如下:

import pandas as pd
import matplotlib
matplotlib.use('Qt5Agg')
import matplotlib.pyplot as plt
from PyQt5 import QtWidgets
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar


# 1配置QT界面
class ScrollableWindow(QtWidgets.QMainWindow):
    def __init__(self, fig):
        self.qapp = QtWidgets.QApplication([])  #QApplication类用于管理GUI应用程序的控制流和主要设置
        QtWidgets.QMainWindow.__init__(self)    #创建窗口
        self.showFullScreen()  # 全屏(*******问题:执行此句后实现全屏,但关闭按钮消失***********)
        self.widget = QtWidgets.QWidget()       #QtWidgets类提供用于UI的图形元素
        self.setCentralWidget(self.widget)      #将把widget设置为主窗口的中心窗口部件
        self.widget.setLayout(QtWidgets.QVBoxLayout())  #setLayout设置用户界面上的屏幕组件的格式布局
        self.widget.layout().setContentsMargins(0, 0, 0, 0) #设置左、上、右、下的外边距
        self.widget.layout().setSpacing(0)                  #设置各部件的相邻距离
        self.fig = fig                                      #fig 大画板
        self.canvas = FigureCanvas(self.fig)                #FigureCanvas画布
        self.canvas.draw()                                  #绘制
        self.scroll = QtWidgets.QScrollArea(self.widget)    #有滚动条的窗口
        self.scroll.setWidget(self.canvas)                  #创建滚动条
        self.nav = NavigationToolbar(self.canvas, self.widget)  #导航工具栏配置
        self.widget.layout().addWidget(self.nav)            #导航工具栏添加至窗口部件中
        self.widget.layout().addWidget(self.scroll)         #有滚动条的窗口添加至窗口部件中
        self.setWindowTitle('Test')
        self.show()
        exit(self.qapp.exec_())

# 2准备数据
data=\
[[816,420,20,-2.2],
 [817,440,19,-2.1],
 [818,430,22,-2.6],
 [819,470,27,-2.0],
 [819,510,24,-1.9],
 [820,410,30,-2.9]]
df=pd.DataFrame(data=data,columns=['深度','参数1','参数2','参数3'])
print(df)

# 3绘图
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False
fig, axes = plt.subplots(nrows=3, ncols=1, figsize=(20, 8)) #将父页面分割成3*1子界面,fig-大画板,axes-相当于图表
fig.suptitle('总标题', fontsize=14, fontweight='bold')
axes.flatten()[0].set_title('子图1', fontsize=12)
axes.flatten()[1].set_title('子图2', fontsize=12)
axes.flatten()[2].set_title('子图3', fontsize=12)
fig.subplots_adjust(left=0.05, right=0.95, bottom=0.1, top=0.9, wspace=0.2, hspace=0.4)

# 3.1绘制参数1曲线
x = df['深度'].tolist()
y = df['参数1'].tolist()
axes.flatten()[0].plot(x, y, label='参数1', linewidth=1)
axes.flatten()[0].set_ylim(400, 800)

# 3.1绘制参数2曲线
x = df['深度'].tolist()
y = df['参数2'].tolist()
axes.flatten()[1].plot(x, y, label='参数2', linewidth=1)

# 3.1绘制参数3曲线
x = df['深度'].tolist()
y = df['参数3'].tolist()
axes.flatten()[2].plot(x, y, label='参数3', linewidth=1)

ScrollableWindow(fig)

展开全部

  • 写回答

2条回答 默认 最新

  • qq_46161207 2023-02-18 12:43
    关注

    在调用self.showFullScreen()时,会将窗口设置为全屏显示并隐藏窗口边框和标题栏,这导致了关闭按钮不可见。

    要使关闭按钮可见,可以考虑自定义窗口标题栏并添加关闭按钮。例如,可以使用QtWidgets.QWidget创建一个自定义标题栏,将它添加到主窗口的布局中,并在自定义标题栏中添加关闭按钮。在按钮的clicked信号上连接一个槽函数,以实现单击关闭按钮时关闭应用程序。

    以下是可能的实现:

    class ScrollableWindow(QtWidgets.QMainWindow):
        def __init__(self, fig):
            self.qapp = QtWidgets.QApplication([])
            QtWidgets.QMainWindow.__init__(self)
            # Hide window border and title bar
            self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
            self.showFullScreen()
            self.widget = QtWidgets.QWidget()
            self.setCentralWidget(self.widget)
            self.widget.setLayout(QtWidgets.QVBoxLayout())
            self.widget.layout().setContentsMargins(0, 0, 0, 0)
            self.widget.layout().setSpacing(0)
            # Create custom title bar
            self.title_bar = QtWidgets.QWidget()
            self.title_bar_layout = QtWidgets.QHBoxLayout()
            self.title_bar_layout.setContentsMargins(0, 0, 0, 0)
            self.title_bar_layout.setSpacing(0)
            self.title_bar.setLayout(self.title_bar_layout)
            self.title_bar.setStyleSheet('background-color: #333333; color: #FFFFFF; font-weight: bold; font-size: 16px')
            # Add title label to custom title bar
            self.title_label = QtWidgets.QLabel('Test')
            self.title_bar_layout.addWidget(self.title_label)
            # Add close button to custom title bar
            self.close_button = QtWidgets.QPushButton('×')
            self.close_button.setStyleSheet('background-color: #FF0000; color: #FFFFFF; font-weight: bold; font-size: 16px')
            self.close_button.clicked.connect(self.close)
            self.title_bar_layout.addWidget(self.close_button, alignment=QtCore.Qt.AlignRight)
            self.widget.layout().addWidget(self.title_bar)
            self.fig = fig
            self.canvas = FigureCanvas(self.fig)
            self.canvas.draw()
            self.scroll = QtWidgets.QScrollArea(self.widget)
            self.scroll.setWidget(self.canvas)
            self.nav = NavigationToolbar(self.canvas, self.widget)
            self.widget.layout().addWidget(self.nav)
            self.widget.layout().addWidget(self.scroll)
            self.setWindowTitle('Test')
            self.show()
            exit(self.qapp.exec_())
    

    在上面的代码中,setWindowFlags用于设置窗口标志,FramelessWindowHint选项指示应用程序隐藏窗口边框和标题栏。自定义标题栏使用QHBoxLayout布局,并将关闭按钮添加到右侧。关闭按钮单击连接close函数,以实现关闭应用程序。最后,将自定义标题栏添加到主窗口的布局中。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)
编辑
预览

报告相同问题?

问题事件

  • 系统已结题 2月25日
  • 已采纳回答 2月18日
  • 创建了问题 2月18日