QTableWdiget单元格中的QLineEdit不会失去焦点

问题描述 投票:0回答:1

我目前正在尝试使用PyQt5创建图形界面。到目前为止,一切都运转良好(毕竟我对此有一定的经验),但是我已经为这个问题苦苦挣扎了几天,而且我在任何地方都找不到解决方案。

[在我的应用程序中,我显示了来自matplotlib的FigureCanvas(以及其他各种小部件),其中有一个键事件连接到一个函数,该函数从鼠标单击中选取一个点并将该点保存在QTableWidget中。但是,我希望用户能够编辑使用验证器拾取的y值,因此我将第二列从保存QTableWidgetItem更改为QLineEdit小部件。一切正常,除非在编辑表中的QLineEdit小部件后按Enter键,焦点不会按预期变化(我将焦点设置为返回画布,但单元格保持活动状态,并且光标闪烁)。

在同一应用中,我在布局中的其他位置有另一个QLineEdit小部件,该小部件可以按预期工作。当我在此框中按Enter时,与其returnPressed信号相关的函数会将焦点发送回画布。

[谁能帮我弄清楚发生了什么吗?

[您知道如何解决此问题吗?

我将我的应用程序剥离回下面粘贴的一个最小示例,其行为保持不变。

仅作总结:

    我在画布上单击并按“ a”,这将调用函数“ add_point”。
  1. 然后单击图中的一个点,该点将在Widget中创建新行并将焦点设置到第二列。
  2. 我在此处输入所需的任何浮点值,然后按Enter。
  3. 然后调用函数'print_val',但是焦点没有按预期返回画布。光标在表格单元格中保持闪烁。
  4. 当我编辑最左边的QLineEdit(在表外部)并按Enter时,将调用函数'func'并将焦点正确地发送回画布。

为什么QLineEdit的两个实例表现不同?

作为参考,函数'print_val'的输出给我:TableWidget有焦点吗?假单元格编辑器有焦点吗? False

提前感谢!

import sys from matplotlib.backends.backend_qt5agg import FigureCanvas, NavigationToolbar2QT as NavigationToolbar from matplotlib.figure import Figure from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import * class GraphicInterface(QMainWindow): def __init__(self, parent=None): QMainWindow.__init__(self, parent) self.setWindowTitle('Test') self._main = QWidget() self.setCentralWidget(self._main) # Create Toolbar and Menubar toolbar = QToolBar() toolbar.setMovable(False) toolbar_fontsize = QFont() toolbar_fontsize.setPointSize(14) quit_action = QAction("Close", self) quit_action.setFont(toolbar_fontsize) quit_action.setStatusTip("Quit the application") quit_action.triggered.connect(self.close) quit_action.setShortcut("ctrl+Q") toolbar.addAction(quit_action) # ============================================================= # Start Layout: layout = QHBoxLayout(self._main) layout.setContentsMargins(0, 0, 0, 0) layout.setSpacing(0) self.line_editor = QLineEdit("3") self.line_editor.setValidator(QIntValidator(1, 100)) self.line_editor.returnPressed.connect(self.func) layout.addWidget(self.line_editor) # Create Table for Pixel Identifications: pixtab_layout = QVBoxLayout() label_pixtab_header = QLabel("Pixel Table\n") label_pixtab_header.setAlignment(Qt.AlignCenter) self.linetable = QTableWidget() self.linetable.verticalHeader().hide() self.linetable.setColumnCount(2) self.linetable.setHorizontalHeaderLabels(["Pixel", "Wavelength"]) self.linetable.setColumnWidth(0, 80) self.linetable.setColumnWidth(1, 90) self.linetable.setFixedWidth(180) pixtab_layout.addWidget(label_pixtab_header) pixtab_layout.addWidget(self.linetable) layout.addLayout(pixtab_layout) # Create Figure Canvas: right_layout = QVBoxLayout() self.fig = Figure(figsize=(6, 6)) self.canvas = FigureCanvas(self.fig) self.canvas.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self.canvas.updateGeometry() self.canvas.mpl_connect('key_press_event', self.on_key_press) self.canvas.setFocusPolicy(Qt.StrongFocus) self.canvas.setFocus() right_layout.addWidget(self.canvas) self.mpl_toolbar = NavigationToolbar(self.canvas, self) right_layout.addWidget(self.mpl_toolbar) layout.addLayout(right_layout) # Plot some random data: self.ax = self.fig.add_subplot(111) self.ax.plot([0, 1, 5, 10, 20], [-1, 2, -4, 5, -2]) def on_key_press(self, e): if e.key == "a": self.add_point() def add_point(self): print("Select point...") point = self.fig.ginput(1) x0, _ = point[0] rowPosition = self.linetable.rowCount() self.linetable.insertRow(rowPosition) item = QTableWidgetItem("%.2f" % x0) item.setFlags(Qt.ItemIsEnabled) item.setBackground(QColor('lightgray')) self.linetable.setItem(rowPosition, 0, item) y_item = QLineEdit("") y_item.setValidator(QDoubleValidator()) y_item.returnPressed.connect(self.print_val) self.linetable.setCellWidget(rowPosition, 1, y_item) self.linetable.cellWidget(rowPosition, 1).setFocus() def print_val(self): rowPosition = self.linetable.rowCount() editor = self.linetable.cellWidget(rowPosition-1, 1) y_in = float(editor.text()) print(" Table value: %.2f" % y_in) # and set focus back to canvas: self.canvas.setFocus() # Check which widget has focus: focus_widget = self.focusWidget() print(focus_widget.__class__) print("TableWidget has focus? %r" % self.linetable.hasFocus()) print("Cell editor has focus? %r" % editor.hasFocus()) def func(self): # dome some stuff print(self.line_editor.text()) # and set focus back to canvas: self.canvas.setFocus() if __name__ == '__main__': # Launch App: qapp = QApplication(sys.argv) app = GraphicInterface() app.show() qapp.exec_()

python pyqt5 qlineedit
1个回答
0
投票
如果要验证QTableWidget的信息,则不必插入QLineEdit,而要使用由委托创建的QLineEdit并在那里设置QValidator:
© www.soinside.com 2019 - 2024. All rights reserved.