PYQT5 qlineedit隐藏后未显示

时间:2019-12-11 11:21:09

标签: python user-interface matplotlib pyqt5

考虑这个玩具示例。我想将line_edit添加到默认的matplotlib工具栏,但仅在执行某些操作后才对用户可见,这是单击按钮。

单击按钮后,line_edit没有显示,但是由于某些原因,isVisible()输出True。如果默认情况下line_edit是可见的,并且我尝试用self.line_edit.hide()隐藏它,则同样适用,它仍然可见,但是isVisible()返回False。因此它本身不会刷新。

这如何真正起作用?为什么line_edit仍然隐藏?有什么建议吗?

import sys
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QLineEdit, QVBoxLayout, QWidget, QPushButton
import matplotlib.pyplot as plt
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT


class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle('Dummy')

        self.figure = plt.figure()
        self.canvas = FigureCanvas(self.figure)
        self.toolbar = NavigationToolbar2QT(self.canvas, self)
        self.ax = self.figure.add_subplot(111)

        self.line_edit = QLineEdit(self)
        self.line_edit.setVisible(False)
        self.toolbar.addWidget(self.line_edit)

        self.btn = QPushButton('Show line', self)
        self.btn.clicked.connect(self.show_line_edit)

        layout = QVBoxLayout()
        layout.addWidget(self.toolbar)
        layout.addWidget(self.canvas)
        layout.addWidget(self.btn)
        self.setLayout(layout)

        self.show()

    def show_line_edit(self):
        self.line_edit.show()
        print("self.line_edit.isVisible(): ")
        print(self.line_edit.isVisible())
        self.line_edit.setFocus()


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

1 个答案:

答案 0 :(得分:1)

NavigationToolbar2QT继承自QtWidgets.QToolBar,并根据documentation of QToolBar

  

注意:您应该使用QAction :: setVisible()更改小部件的可见性。使用QWidget :: setVisible(),QWidget :: show()和QWidget :: hide()无效。

因此,要解决这个问题,您可以做类似的事情

def initUI(self):

    ....

    self.line_edit = QLineEdit(self)
    self.line_edit.setVisible(False)
    self.line_action = self.toolbar.addWidget(self.line_edit)

    ....

def show_line_edit(self):
    self.line_action.setVisible(True)
    ....