Python PyQt5在关闭后从Qdialog窗口到Main窗口获取值

Python PyQt5在关闭后从Qdialog窗口到Main窗口获取值,python,pyqt,pyqt5,Python,Pyqt,Pyqt5,我想在关闭Qdailog或Qwidget窗口后,将值从Qdialog窗口获取到Qmainwindow。其实我不知道怎么做 其思想是,当用户从QtableWidget中选择根值时,如下图所示,数据显示在QWidget上,我想将这些值转换或传递到我的Qmainwindow,在这种情况下,我的第二个窗口是Circular.py,将消失,但是我的值应该在qmain窗口中可用 窗口可视化。 代码“main.py” 第二个窗口代码“Circular.py” 请注意,此代码先前发布在此处 导入系统 导入操作

我想在关闭
Qdailog或Qwidget
窗口后,将值从
Qdialog
窗口获取到
Qmainwindow
。其实我不知道怎么做

其思想是,当用户从
QtableWidget
中选择根值时,如下图所示,数据显示在
QWidget
上,我想将这些值转换或传递到我的
Qmainwindow
,在这种情况下,我的第二个窗口是
Circular.py
,将消失,但是我的值应该在
qmain窗口中可用

窗口可视化。

代码“main.py”

第二个窗口代码“Circular.py”

请注意,此代码先前发布在此处

导入系统 导入操作系统 从PyQt5导入QtCore、QtGui、QtWidgets iconroot=os.path.dirname(_文件__) 组织机构名称='Circular App' 组织结构域='圆形' 应用程序名称='Circulargometry program' 设置\托盘='设置/托盘' QSS=“” QTreeWidget{ 边界:无; } QTreeView::分支:具有同级:!邻接项{ 边框图片:url(images/vline.png)0; } QTreeView::分支:具有同级:邻接项{ 边框图片:url(images/branch more.png)0; } QTreeView::分支:!有子项:!有同级项:邻接项{ 边框图片:url(images/branch end.png)0; } QTreeView::分支:有子级:!有同级:已关闭, QTreeView::分支:已关闭:有子级:有同级{ 边界图像:无; image:url(images/branch closed.png); } QTreeView::分支:打开:有子级:!有同级, QTreeView::分支:打开:有子级:有同级{ 边界图像:无; image:url(images/branch open.png); } """ 类TreeWidget(QtWidgets.QTreeWidget): currentTextChanged=QtCore.pyqtSignal(str) def uuu init uuu(self,parent=None): 超级(树边,自).\u初始(父) self.currentItemChanged.connect(self.onCurrentItemChanged) self.setHeaderLabel(“标准节库”) self.setRootIsDecorated(真) self.setAlternatingRowColor(真) self.readSettings() self.expandAll() def onCurrentItemChanged(自身、当前、以前): 如果当前不在范围(self.topLevelItemCount())内ix的[self.topLevelItem(ix)]中: self.currentTextChanged.emit(current.text(0)) def读取设置(自身): 设置=QtCore.QSettings() settings.beginGroup(“TreeWidget”) 值=设置值(“项目”) 如果值为“无”: self.loadDefault() 其他: TreeWidget.dataToChild(值,self.invisibleRootItem()) self.customized_项目=无 对于范围内的ix(self.topLevelItemCount()): t水平项目=自身。顶级项目(九) 如果tlevel_item.text(0)=“自定义”: self.customized_item=t级别_item settings.endGroup() def写入设置(自): 设置=QtCore.QSettings() settings.beginGroup(“TreeWidget”) settings.setValue(“items”,TreeWidget.dataFromChild(self.invisibleRootItem())) settings.endGroup() def加载默认值(自): standardsectionlist=[“D100”、“D150”、“D200”、“D250”、“D300”、“D350”、“D400”、“D450”、“D500”, “D550”、“D600”、“D650”、“D700”、“D750”、“D800”、“D850”、“D900”、“D950”、“D1000”] rootItem=QtWidgets.QTreeWidgetItem(self,['Circular shapes'])) setIcon(0,QtGui.QIcon(os.path.join(iconroot,“images/circularcolumnnorebar.png”)) 对于standardsectionlist中的元素: addChild(QtWidgets.QTreeWidgetItem([element])) self.customized_item=QtWidgets.QTreeWidgetItem(self,[“customized”]) self.customized_item.setIcon(0,QtGui.QIcon(os.path.join(iconroot,“images/circularcolumnorebar.png”)) @静力学方法 def dataToChild(信息,项目): TreeWidget.tupleToItem(信息[“数据”],项) 对于信息[“儿童”]中的val: child=QtWidgets.QTreeWidgetItem() 项目.添加子项(子项) TreeWidget.dataToChild(val,child) @静力学方法 def tupleToItem(t,项目): #将值设置为项目 ba,isSelected=t ds=QtCore.QDataStream(ba) ds>>项目 项目.已选定(已选定) @静力学方法 def dataFromChild(项目): l=[] 对于范围内的i(item.childCount()): 子项=项。子项(i) l、 追加(TreeWidget.dataFromChild(child)) 返回{“childrens”:l,“data”:TreeWidget.itemToTuple(item)} @静力学方法 def itemToTuple(项目): #从项返回值 ba=QtCore.QByteArray() ds=QtCore.QDataStream(ba,QtCore.QIODevice.WriteOnly)
ds要做的第一件事是验证,如果您接受或不使用返回代码的exec():
QDialog::Accepted
,如果您要获取文本,必须使用关系树:

def buttonfunc(self):
    app.setStyleSheet(QSS)
    subwindow=CircularDialog()
    subwindow.setWindowModality(QtCore.Qt.ApplicationModal)
    if subwindow.exec_() == QtWidgets.QDialog.Accepted:
        print('Test', subwindow.infoWidget.ilabel.text())

您希望获得什么值?我希望获得
class InfoWidget
下的
self.ilabel.text()
值。请尝试使用我的更新解决方案。我已尝试使用更新解决方案并使用解决方案更新了上述代码。非常感谢。太好了,它很管用。代码已添加并更新。@ZarKha不要用我的答案更新代码,如果您这样做,则不会出现错误,因此其他未来用户将无法理解问题所在。很好,我已尝试将其写回,但我发现您已将其修复:)
import sys
import os
from PyQt5 import QtCore, QtGui, QtWidgets

iconroot = os.path.dirname(__file__)
ORGANIZATION_NAME = 'Circular App'
ORGANIZATION_DOMAIN = 'Circular shape'
APPLICATION_NAME = 'Circulargeometry program'
SETTINGS_TRAY = 'settings/tray'

QSS = """
QTreeWidget{
    border:none;
 } 

QTreeView::branch:has-siblings:!adjoins-item {
   border-image: url(images/vline.png) 0;
}

QTreeView::branch:has-siblings:adjoins-item {
    border-image: url(images/branch-more.png) 0;
}

QTreeView::branch:!has-children:!has-siblings:adjoins-item {
    border-image: url(images/branch-end.png) 0;
}

QTreeView::branch:has-children:!has-siblings:closed,
QTreeView::branch:closed:has-children:has-siblings {
    border-image: none;
    image: url(images/branch-closed.png);
}

QTreeView::branch:open:has-children:!has-siblings,
QTreeView::branch:open:has-children:has-siblings {
    border-image: none;
    image: url(images/branch-open.png);
}
"""



class TreeWidget(QtWidgets.QTreeWidget):
    currentTextChanged = QtCore.pyqtSignal(str)

    def __init__(self, parent=None):
        super(TreeWidget, self).__init__(parent)
        self.currentItemChanged.connect(self.onCurrentItemChanged)
        self.setHeaderLabel('Standard Section Library')
        self.setRootIsDecorated(True)
        self.setAlternatingRowColors(True)
        self.readSettings()
        self.expandAll()

    def onCurrentItemChanged(self, current, previous):
        if current not in [self.topLevelItem(ix) for ix in range(self.topLevelItemCount())]:
            self.currentTextChanged.emit(current.text(0))

    def readSettings(self):
        settings = QtCore.QSettings()
        settings.beginGroup("TreeWidget")
        values = settings.value("items")
        if values is None:
            self.loadDefault()
        else:
            TreeWidget.dataToChild(values, self.invisibleRootItem())
            self.customized_item = None
            for ix in range(self.topLevelItemCount()):
                tlevel_item = self.topLevelItem(ix)
                if tlevel_item.text(0) == "Customized":
                    self.customized_item = tlevel_item
        settings.endGroup()

    def writeSettings(self):
        settings = QtCore.QSettings()
        settings.beginGroup("TreeWidget")
        settings.setValue("items", TreeWidget.dataFromChild(self.invisibleRootItem()))
        settings.endGroup()

    def loadDefault(self):
        standardsectionlist = ["D100","D150","D200","D250","D300","D350","D400","D450","D500",
        "D550","D600","D650","D700","D750","D800","D850","D900","D950","D1000"]
        rootItem = QtWidgets.QTreeWidgetItem(self, ['Circular shapes'])
        rootItem.setIcon(0, QtGui.QIcon(os.path.join(iconroot,"images/circularcolumnnorebar.png")))
        for element in standardsectionlist:
            rootItem.addChild(QtWidgets.QTreeWidgetItem([element]))

        self.customized_item = QtWidgets.QTreeWidgetItem(self, ["Customized"])
        self.customized_item.setIcon(0, QtGui.QIcon(os.path.join(iconroot,"images/circularcolumnnorebar.png")))

    @staticmethod
    def dataToChild(info, item):
        TreeWidget.tupleToItem(info["data"], item)
        for val in info["childrens"]:
            child = QtWidgets.QTreeWidgetItem()
            item.addChild(child)
            TreeWidget.dataToChild(val, child)

    @staticmethod
    def tupleToItem(t, item):
        # set values to item
        ba, isSelected = t
        ds = QtCore.QDataStream(ba)
        ds >> item
        item.setSelected(isSelected) 

    @staticmethod
    def dataFromChild(item):
        l = []
        for i in range(item.childCount()):
            child = item.child(i)
            l.append(TreeWidget.dataFromChild(child))
        return {"childrens": l, "data": TreeWidget.itemToTuple(item)}

    @staticmethod
    def itemToTuple(item):
        # return values from item
        ba = QtCore.QByteArray()
        ds = QtCore.QDataStream(ba, QtCore.QIODevice.WriteOnly)
        ds << item
        return ba, item.isSelected()


class InfoWidget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(InfoWidget, self).__init__(parent)
        hlay = QtWidgets.QHBoxLayout(self)
        plabel = QtWidgets.QLabel()
        pixmap = QtGui.QPixmap(os.path.join(iconroot, "images/circularcolumnnorebard.png"))\
                    .scaled(230, 230, QtCore.Qt.KeepAspectRatio)
        plabel.setPixmap(pixmap)
        hlay.addWidget(plabel)
        self.ilabel = QtWidgets.QLabel()
        hlay.addWidget(self.ilabel)
        hlay.addStretch()
        self.readSettings()

    @QtCore.pyqtSlot(str)
    def setData(self, text):
        try:
            circular_section = int(text.translate({ord('D'): ""}))
            area = (3.1416/4)*(circular_section**2)
            inertia = (3.1416/64)*circular_section**4
            fmt = "D = {}mm\nA = {:0.2E}mm2\n I  = {:0.2E}mm4"
            self.ilabel.setText(fmt.format(circular_section, area, inertia))
        except ValueError:
            pass
        return print(circular_section)
    def readSettings(self):
        settings = QtCore.QSettings()
        settings.beginGroup("InfoWidget")
        self.ilabel.setText(settings.value("text", ""))
        settings.endGroup()

    def writeSettings(self):
        settings = QtCore.QSettings()
        settings.beginGroup("InfoWidget")
        settings.setValue("text", self.ilabel.text())
        settings.endGroup()


class CircularDialog(QtWidgets.QDialog):
    def __init__(self, parent=None):
        super(CircularDialog, self).__init__(parent)

        self.setWindowTitle("Frequently used shape")
        self.setWindowIcon(QtGui.QIcon(os.path.join(iconroot+"/images/circularcolumnnorebar.png")))


        grid = QtWidgets.QGridLayout(self)

        self.tree = TreeWidget()
        self.infoWidget = InfoWidget()

        section_lay = QtWidgets.QHBoxLayout()
        section_label = QtWidgets.QLabel("Section name: ")
        self.section_edit = QtWidgets.QLineEdit('Define en name to section')
        section_lay.addWidget(section_label)
        section_lay.addWidget(self.section_edit)

        self.tree.currentTextChanged.connect(self.infoWidget.setData)

        button_layout = QtWidgets.QVBoxLayout()
        add_button = QtWidgets.QPushButton("Add")
        add_button.clicked.connect(self.addItem)
        delete_button = QtWidgets.QPushButton("Delete")
        delete_button.clicked.connect(self.removeItem)
        button_layout.addWidget(add_button, alignment=QtCore.Qt.AlignBottom)
        button_layout.addWidget(delete_button, alignment=QtCore.Qt.AlignTop)

        buttonBox = QtWidgets.QDialogButtonBox()
        buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel|QtWidgets.QDialogButtonBox.Ok)
        buttonBox.accepted.connect(self.accept) 
        buttonBox.rejected.connect(self.reject)
        self.accepted.connect(self.save_all_data)
        self.rejected.connect(self.save_all_data)

        grid.addLayout(section_lay, 0, 0)
        grid.addWidget(self.tree, 1, 0)
        grid.addLayout(button_layout, 1, 1)
        grid.addWidget(self.infoWidget, 2, 0, 1, 2)
        grid.addWidget(buttonBox, 3, 0, 1, 2)
        self.readSettings()

    def readSettings(self):
        settings = QtCore.QSettings()
        settings.beginGroup("CircularDialog")
        self.setGeometry(settings.value("geometry", QtCore.QRect(300, 300, 400, 600)))
        self.section_edit.setText(settings.value("SectionInfo", "Define en name to section"))
        settings.endGroup()

    def writeSettings(self):
        settings = QtCore.QSettings()
        settings.beginGroup("CircularDialog")
        settings.setValue("geometry", self.geometry())
        settings.setValue("SectionInfo",self.section_edit.text())
        settings.endGroup()

    def closeEvent(self, event):
        self.save_all_data()
        super(CircularDialog, self).closeEvent(event)

    def save_all_data(self):
        for children in self.findChildren(QtWidgets.QWidget) + [self]:
            if hasattr(children, "writeSettings"):
                children.writeSettings()

    def addItem(self):
        text, ok = QtWidgets.QInputDialog.getText(self, "Add custom section", 
            "Enter section geometry f.ex as D325 or just 325 in mm: ")
        if ok:
            it = QtWidgets.QTreeWidgetItem([text])
            self.tree.customized_item.addChild(it)

    def removeItem(self):
        it = self.tree.customized_item.takeChild(0)
        del it


if __name__ == '__main__':
    QtCore.QCoreApplication.setApplicationName(ORGANIZATION_NAME)
    QtCore.QCoreApplication.setOrganizationDomain(ORGANIZATION_DOMAIN)
    QtCore.QCoreApplication.setApplicationName(APPLICATION_NAME)

    app = QtWidgets.QApplication(sys.argv)
    app.setStyleSheet(QSS)
    w = CircularDialog()
    w.show()
    sys.exit(app.exec_())
def buttonfunc(self):
    app.setStyleSheet(QSS)
    subwindow=CircularDialog()
    subwindow.setWindowModality(QtCore.Qt.ApplicationModal)
    if subwindow.exec_() == QtWidgets.QDialog.Accepted:
        print('Test', subwindow.infoWidget.ilabel.text())