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())