首页 > 解决方案 > 如何用鼠标点击父窗口的Qtablewidget中的某个单元格获取值,然后填充到子窗口的QlineEdit中?

问题描述

我想做一个函数,有点像 Excel 中的插入函数,就像这样: 在此处输入图像描述

现在我很困惑如何使用鼠标在父窗口(Qtablewidget)中获取数据并将数据填充到鼠标光标停留在子窗口中的lineEdit中。换句话说,我如何知道光标是哪个组件在。

这是 MainWindow.py:

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(1191, 941)
        self.verticalLayout_3 = QtWidgets.QVBoxLayout(Form)
        self.verticalLayout_3.setObjectName("verticalLayout_3")
        self.verticalLayout_2 = QtWidgets.QVBoxLayout()
        self.verticalLayout_2.setObjectName("verticalLayout_2")
        self.frame = QtWidgets.QFrame(Form)
        self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.frame.setFrameShadow(QtWidgets.QFrame.Raised)
        self.frame.setObjectName("frame")
        self.horizontalLayout = QtWidgets.QHBoxLayout(self.frame)
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.pushButton = QtWidgets.QPushButton(self.frame)
        self.pushButton.setObjectName("pushButton")
        self.horizontalLayout.addWidget(self.pushButton)
        self.pushButton_2 = QtWidgets.QPushButton(self.frame)
        self.pushButton_2.setObjectName("pushButton_2")
        self.horizontalLayout.addWidget(self.pushButton_2)
        spacerItem = QtWidgets.QSpacerItem(940, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout.addItem(spacerItem)
        self.verticalLayout_2.addWidget(self.frame)
        self.tabWidget = QtWidgets.QTabWidget(Form)
        self.tabWidget.setTabPosition(QtWidgets.QTabWidget.West)
        self.tabWidget.setObjectName("tabWidget")
        self.tab = QtWidgets.QWidget()
        self.tab.setObjectName("tab")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.tab)
        self.verticalLayout.setObjectName("verticalLayout")
        self.tableWidget = QtWidgets.QTableWidget(self.tab)
        self.tableWidget.setRowCount(5)
        self.tableWidget.setObjectName("tableWidget")
        self.tableWidget.setColumnCount(4)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(0, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(1, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(2, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(3, item)
        self.verticalLayout.addWidget(self.tableWidget)
        self.tabWidget.addTab(self.tab, "")
        self.tab_2 = QtWidgets.QWidget()
        self.tab_2.setObjectName("tab_2")
        self.tabWidget.addTab(self.tab_2, "")
        self.verticalLayout_2.addWidget(self.tabWidget)
        self.verticalLayout_3.addLayout(self.verticalLayout_2)

        self.retranslateUi(Form)
        self.tabWidget.setCurrentIndex(0)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Form"))
        self.pushButton.setText(_translate("Form", "PushButton"))
        self.pushButton_2.setText(_translate("Form", "PushButton"))
        item = self.tableWidget.horizontalHeaderItem(0)
        item.setText(_translate("Form", "A"))
        item = self.tableWidget.horizontalHeaderItem(1)
        item.setText(_translate("Form", "B"))
        item = self.tableWidget.horizontalHeaderItem(2)
        item.setText(_translate("Form", "C"))
        item = self.tableWidget.horizontalHeaderItem(3)
        item.setText(_translate("Form", "D"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("Form", "Tab 1"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("Form", "Tab 2"))

这是 ChildWindow.py:

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(558, 331)
        self.verticalLayout_2 = QtWidgets.QVBoxLayout(Dialog)
        self.verticalLayout_2.setObjectName("verticalLayout_2")
        self.frame = QtWidgets.QFrame(Dialog)
        self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.frame.setFrameShadow(QtWidgets.QFrame.Raised)
        self.frame.setObjectName("frame")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.frame)
        self.verticalLayout.setObjectName("verticalLayout")
        self.groupBox = QtWidgets.QGroupBox(self.frame)
        self.groupBox.setObjectName("groupBox")
        self.gridLayout = QtWidgets.QGridLayout(self.groupBox)
        self.gridLayout.setObjectName("gridLayout")
        self.label = QtWidgets.QLabel(self.groupBox)
        self.label.setObjectName("label")
        self.gridLayout.addWidget(self.label, 0, 0, 1, 1)
        self.lineEdit = QtWidgets.QLineEdit(self.groupBox)
        self.lineEdit.setObjectName("lineEdit")
        self.gridLayout.addWidget(self.lineEdit, 0, 1, 1, 1)
        self.label_2 = QtWidgets.QLabel(self.groupBox)
        self.label_2.setObjectName("label_2")
        self.gridLayout.addWidget(self.label_2, 1, 0, 1, 1)
        self.lineEdit_2 = QtWidgets.QLineEdit(self.groupBox)
        self.lineEdit_2.setObjectName("lineEdit_2")
        self.gridLayout.addWidget(self.lineEdit_2, 1, 1, 1, 1)
        self.label_3 = QtWidgets.QLabel(self.groupBox)
        self.label_3.setObjectName("label_3")
        self.gridLayout.addWidget(self.label_3, 2, 0, 1, 1)
        self.lineEdit_3 = QtWidgets.QLineEdit(self.groupBox)
        self.lineEdit_3.setObjectName("lineEdit_3")
        self.gridLayout.addWidget(self.lineEdit_3, 2, 1, 1, 1)
        self.verticalLayout.addWidget(self.groupBox)
        self.frame_2 = QtWidgets.QFrame(self.frame)
        self.frame_2.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.frame_2.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.frame_2.setObjectName("frame_2")
        self.horizontalLayout = QtWidgets.QHBoxLayout(self.frame_2)
        self.horizontalLayout.setObjectName("horizontalLayout")
        spacerItem = QtWidgets.QSpacerItem(88, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout.addItem(spacerItem)
        self.pushButton_3 = QtWidgets.QPushButton(self.frame_2)
        self.pushButton_3.setObjectName("pushButton_3")
        self.horizontalLayout.addWidget(self.pushButton_3)
        spacerItem1 = QtWidgets.QSpacerItem(87, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout.addItem(spacerItem1)
        self.verticalLayout.addWidget(self.frame_2)
        self.verticalLayout_2.addWidget(self.frame)
        self.line = QtWidgets.QFrame(Dialog)
        self.line.setFrameShape(QtWidgets.QFrame.HLine)
        self.line.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.line.setObjectName("line")
        self.verticalLayout_2.addWidget(self.line)
        self.frame_3 = QtWidgets.QFrame(Dialog)
        self.frame_3.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.frame_3.setFrameShadow(QtWidgets.QFrame.Raised)
        self.frame_3.setObjectName("frame_3")
        self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.frame_3)
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        spacerItem2 = QtWidgets.QSpacerItem(150, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_2.addItem(spacerItem2)
        self.pushButton_4 = QtWidgets.QPushButton(self.frame_3)
        self.pushButton_4.setObjectName("pushButton_4")
        self.horizontalLayout_2.addWidget(self.pushButton_4)
        self.pushButton_5 = QtWidgets.QPushButton(self.frame_3)
        self.pushButton_5.setObjectName("pushButton_5")
        self.horizontalLayout_2.addWidget(self.pushButton_5)
        spacerItem3 = QtWidgets.QSpacerItem(149, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_2.addItem(spacerItem3)
        self.verticalLayout_2.addWidget(self.frame_3)

        self.retranslateUi(Dialog)
        QtCore.QMetaObject.connectSlotsByName(Dialog)

    def retranslateUi(self, Dialog):
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", "IF_1"))
        self.groupBox.setTitle(_translate("Dialog", "IF"))
        self.label.setText(_translate("Dialog", "Logical_text"))
        self.label_2.setText(_translate("Dialog", "True_value"))
        self.label_3.setText(_translate("Dialog", "Flase_value"))
        self.pushButton_3.setToolTip(_translate("Dialog", "<html><head/><body><p>打开下一级嵌套&lt;/p></body></html>"))
        self.pushButton_3.setText(_translate("Dialog", "Nested"))
        self.pushButton_4.setText(_translate("Dialog", "Save"))
        self.pushButton_5.setText(_translate("Dialog", "Close"))

这是逻辑文件:

import sys, traceback

from PyQt5 import QtCore
from PyQt5.QtWidgets import QApplication, QMenu, QTableWidgetItem, QWidget, QDialog, QMessageBox
from PyQt5.QtCore import QObject, Qt, pyqtSignal

from UI.test import test
from UI.test.IF_1 import Ui_Dialog


class IF_window(QDialog, Ui_Dialog):
    Signal = pyqtSignal(str)

    def __init__(self):
        super(IF_window, self).__init__()
        self.setupUi(self)
        #self.pushButton_3.clicked.connect(self.btnclick)
        self.pushButton_4.clicked.connect(self.trans_data)
        self.pushButton_5.clicked.connect(self.close)

    def trans_data(self):
        a = self.lineEdit.text()
        b = self.lineEdit_2.text()
        c = self.lineEdit_3.text()
        d = 'IF(' + a + ',' + b + ',' + c + ')'
        self.Signal.emit(d)
        QMessageBox.information(self, "notice", "Save success!", QMessageBox.Yes)

    def btnclick(self):
        try:
            self.form = IF_window_2()
            #styleFile = 'E:\Development\Study\Qss\qss.css'
            #qssStyle = CommonHelper.readQss(styleFile)
            #self.form.setStyleSheet(qssStyle)
            self.form.Signal_1.connect(self.signal_text_1)
            self.form.Signal_2.connect(self.signal_text_2)
            self.form.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint)
            self.form.show()
        except:
            exc_type, exc_value, exc_traceback = sys.exc_info()
            a = repr(traceback.format_exception(exc_type, exc_value,
                                                exc_traceback))
            QMessageBox.information(self, "notice", a, QMessageBox.Yes)

    def signal_text_1(self, d):
        self.lineEdit_2.setText(d)

    def signal_text_2(self, d):
        self.lineEdit_3.setText(d)

class MyMainWindow(QWidget, test.Ui_Form):
    def __init__(self):
        super(MyMainWindow, self).__init__()
        self.setupUi(self)

        self.tableWidget.setContextMenuPolicy(Qt.CustomContextMenu)
        self.tableWidget.customContextMenuRequested.connect(self.generateMenu)

    def generateMenu(self, pos):

        try:
            column_num = -1
            row_sum = []
            column_sum = []
            for i in self.tableWidget.selectionModel().selection().indexes():
                row_num = i.row()
                column_num = i.column()
                row_sum.append(row_num)
                column_sum.append(column_num)

            if column_num != -1:
                menu = QMenu()
                item1 = menu.addAction(u"IF_function")
                action = menu.exec_(self.tableWidget.mapToGlobal(pos))

                if action == item1:
                    self.form = IF_window()
                    #styleFile = 'E:\Development\Study\Qss\qss.css'
                    #qssStyle = CommonHelper.readQss(styleFile)
                    #self.form.setStyleSheet(qssStyle)
                    self.form.Signal.connect(self.get_data)
                    self.form.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint)
                    self.form.show()
                else:
                    return

        except:
            exc_type, exc_value, exc_traceback = sys.exc_info()
            a = repr(traceback.format_exception(exc_type, exc_value,
                                                exc_traceback))
            QMessageBox.information(self, "notice", a, QMessageBox.Yes)

    def get_data(self, d):
        try:
            row_sum = []
            column_sum = []
            for i in self.tableWidget.selectionModel().selection().indexes():
                row_num = i.row()
                column_num = i.column()
                row_sum.append(row_num)
                column_sum.append(column_num)
            data = QTableWidgetItem(d)
            self.tableWidget.setItem(row_sum[0], column_sum[0], data)

            print(row_sum[0], column_sum[0])

        except:
            exc_type, exc_value, exc_traceback = sys.exc_info()
            a = repr(traceback.format_exception(exc_type, exc_value,
                                                exc_traceback))
            QMessageBox.information(self, "notice", a, QMessageBox.Yes)


class CommonHelper:
    def __init__(self):
        pass

    @staticmethod
    def readQss(style):
        with open(style, 'r', encoding='UTF-8') as f:
            return f.read()


if __name__ == "__main__":
    app = QApplication(sys.argv)
    win = MyMainWindow()
    #styleFile = 'E:\Development\Study\Qss\qss.css'
    #qssStyle = CommonHelper.readQss(styleFile)
    #win.setStyleSheet(qssStyle)
    win.show()
    sys.exit(app.exec_())

标签: pyqt5python-3.7

解决方案


我通过向子窗口的 LineEdit 添加一个 clicked 信号来解决这个问题,该信号会触发一个文本信号。父窗口接收信号并使用文本来确定单击了哪个子窗口的 LineEdit,然后获取父窗口的单击单元格的值,并且简单设置文本()。


推荐阅读