我在 QMainwindow 和 Qdialog 窗口之间切换,但是当我退出 QDIALOG 时它会导致整个程序崩溃

问题描述

from PyQt5.QtWidgets import QWidget
from PyQt5.QtWidgets import QDialog
from PyQt5 import uic
from PyQt5.QtWidgets import QApplication
from PyQt5.QtWidgets import QPushButton
from PyQt5.QtWidgets import QLineEdit
from PyQt5.QtWidgets import QLabel
import re



import sys

class Window(QDialog):
    def __init__(self):
        super(Window,self).__init__()
        uic.loadUi("formDialog.ui",self)
        self.button = self.findChild(QPushButton,"submit")
        self.cancelButton = self.findChild(QPushButton,"cancelButton")


        self.text = self.findChild(QLineEdit,"locationLineEdit")
        self.date = self.findChild(QLineEdit,"dateLineEdit")
        self.iso = self.findChild(QLineEdit,"isoEdit")
        ##self.date.setText("ggg")
        self.newCases = self.findChild(QLineEdit,"newCasesLineEdit")
        self.newDeaths = self.findChild(QLineEdit,"newDeathsLineEdit")



        self.button.clicked.connect(self.preSubmitValue)
        self.error = self.findChild(QLabel,"errorLabel")
        self.error.setHidden(True)






    def verifyString(self,value):
        if value == "" or   not value.isalpha():
            return True
        return False


    def verifyNumber(self,value):
        if value == "" or not value.isdigit():
            return True
        return False

    def preSubmitValue(self):
        if self.verifyString(self.text.text()) == False and self.verifyNumber(self.newCases.text()) == False and self.verifyNumber(self.newDeaths.text()) == False and self.verifyString(self.iso.text())==False and self.verifyDate(self.date.text()) == False:
            self.submitValue()

        else:
            self.error.setText("<font color='red'>Please fill out the fields properly</font>")
            self.error.setHidden(False)
            return False





    def submitValue(self):
        location,cases,deaths,iso,date= self.text.text(),self.newCases.text(),self.newDeaths.text(),self.iso.text(),self.date.text()
        return location,date

    def verifyDate(self,value):
        text = r"\d{4}[-/]\d{2}[-/]\d{2}"
        if  self.date.text() !="" and re.match(text,self.date.text()):
            return False
        return True

这是上面的QDIALOG

import sys
import csv
from main import Window
from PyQt5.QtCore import Qt
from PyQt5.Qtsql import QsqlDatabase
from PyQt5.QtWidgets import QApplication
from PyQt5.QtWidgets import QLabel
from PyQt5.QtWidgets import QWidget
from PyQt5.QtWidgets import qformlayout
from PyQt5.QtWidgets import QLineEdit
from PyQt5.QtWidgets import QMainWindow
from PyQt5.QtWidgets import QAction
from PyQt5.QtWidgets import QPushButton
from PyQt5.QtWidgets import QMenu
from PyQt5.Qtsql import QsqlTableModel
from PyQt5.Qtsql import QsqlQuery
from PyQt5.QtWidgets import QTableView
from PyQt5 import QtGui,QtCore
from PyQt5.QtWidgets import QStatusBar
from PyQt5.QtWidgets import QLineEdit


class Menu(QMainWindow):
    model = None
    con = None
    cursor = None
    length = 102
    addButton = None
    deleteBtton = None

    def __init__(self):
        super(Menu,self).__init__()
        self.resize(415,200)
        self.setwindowTitle("CODY HOWARD COVID CASES")
        self.createWidgets()
        toolbar = self.addToolBar("&MEnu")
        toolbar.addWidget(self.addButton)
        toolbar.addWidget(self.deleteBtton)
        toolbar.addWidget(self.searchField)
        self.createStatusBar()
        self.createConnection()
        self.model = QsqlTableModel(self)
        self.model.setTable("CovidCases")
        self.model.setEditStrategy(QsqlTableModel.OnFieldChange)
        self.model.setHeaderData(0,Qt.Horizontal,"ISO_CODE")
        self.model.setHeaderData(1,"Location")
        self.model.setHeaderData(2,"Date")
        self.model.setHeaderData(3,"New_cases")
        self.model.setHeaderData(4,"New_deaths")
        self.loadData()
        self.addButton.clicked.connect(self.addNewRow)
        # Set up the view
        self.view = QTableView()
        self.view.setModel(self.model)
        self.view.setwindowTitle("VIEW")
        self.view.resizeRowsToContents()
        for i in range(5):
            self.view.setColumnWidth(i,400)
        self.setCentralWidget(self.view)

    def createStatusBar(self):
        status = QStatusBar()
        status.showMessage("To update any of the cases,double click on a cell and Press enter after edit")
        self.setStatusBar(status)

    def createWidgets(self):
        self.addButton = QPushButton("Add new Row")
        self.deleteBtton = QPushButton("Delete a row")
        self.searchField = QLineEdit("Search")

    def addNewRow(self):##Here this is the method where i start the window,the program is meant to take some data from the QDIALOG and insert it into the QsqlTABLEMODEL BUT ALWAYS CRASHES AFTER IT EXITS
        win = Window()
        win.exec()_
        location,date = win.submitValue()
        print("fff0" + str(value1) + str(cases) + str(deaths) + iso + date)
        row = self.model.record()
        row.setValue("ISO_CODE",iso)
        row.setValue("Location",location)
        row.setValue("Date",date)
        row.setValue("New_Cases",cases)
        row.setValue("New_deaths",deaths)
        self.model.insertRecord(-1,row)


    def loadData(self):
        print("d")
        file = "C:\\Users\\Gabri\\Downloads\\owid-covid-data.csv"
        with open(file,mode="r") as csvFile:
            csvReader = csv.reader(csvFile);
            headers = next(csvReader);
            row = self.model.record()
            print("Programmed by Cody H")
            x = 0;
            while x <= 100:
                for lines in csvReader:
                    self.insert = (lines[0],lines[1],lines[2],lines[3],lines[4]);
                    row.setValue("ISO_CODE",lines[0])
                    row.setValue("Location",lines[1])
                    row.setValue("Date",lines[2])
                    row.setValue("New_Cases",lines[3])
                    row.setValue("New_deaths",lines[4])
                    self.model.insertRecord(x,row)
                    x += 1;
                    if x >= self.length:
                        break;

    def createConnection(self):
        self.con = QsqlDatabase.addDatabase("QsqlITE")
        self.con.setDatabaseName(r"C:\Users\Gabri\PycharmProjects\PyQT\recordsTest.sqlite")
        if not self.con.open():
            QMessageBox.critical(
                None,"QTableView Example - Error!","Database Error: %s" % con.lastError().databaseText(),)
            sys.exit(1)
        self.cursor = QsqlQuery()
        self.cursor.exec(
            """
            CREATE TABLE CovidCases (
                 iso_code integer NOT NULL,location text NOT NULL,date text NOT NULL,new_cases integer NOT NULL,new_deaths varchar(255)  

            )
            """
        )
        print(self.con.tables())


app = QApplication(sys.argv)
win = Menu()
win.show()

sys.exit(app.exec_())

Qdialog 是一种表单,它在 QmainWindow 的“AddNewRow”方法中将数据传递到另一个窗口,以便我可以将其插入到数据库中。 Qdialog 可以正常打开并获取数据,但是一旦我单击提交(该程序旨在从表单中返回值并关闭 Qdialog,但是一旦关闭该程序就会挂起然后崩溃。我可能做错了什么?是否有特定的退出 QDialog 的方法

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)