'Save' 和 'Save as' 使用 QFileDialog.getSaveFile()

'Save' and 'Save as' using QFileDialog.getSaveFile()

我正在研究记事本克隆。虽然保存文件很简单,但我还是遇到了以下问题:

QFileDialog.getSavefile() 始终提示用户保存文件,即使文件之前已保存并且未对其进行任何更改。如果没有对文件进行任何更改,如何让我的记事本智能地忽略保存命令?就像windows.

中真正的记事本一样

这是我的项目保存功能的摘录:

def save_file(self):
    """
    Saves the user's work.
    :return: True if the saving is successful. False if otherwise
    """
    options = QFileDialog.Options()
    options |= QFileDialog.DontUseNativeDialog
    file_name, _ = QFileDialog.getSaveFileName(self,"Save File","","All Files(*);;Text Files(*.txt)",options = options)
    if file_name:
        f = open(file_name, 'w')
        text = self.ui.textEdit.toPlainText()
        f.write(text)
        self.setWindowTitle(str(os.path.basename(file_name)) + " - Notepad Alpha")
        f.close()
        return True
    else:
        return False

您的问题与QFileDialog无关,与您的程序逻辑有关。

可以用一个变量来存放当前文件名,留给None开头。然后创建两个不同的函数,一个用于“保存”(如果设置了文件名,它将尝试保存文件),一个用于“另存为”(它将始终显示文件对话框。

此外,考虑到如果文档需要保存,您可以使用 windowModified 属性 到 set/know(并让用户知道):

class Notepad(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('New document - Notepad Alpha[*]')
        fileMenu = self.menuBar().addMenu('File')
        saveAction = fileMenu.addAction('Save')
        saveAction.triggered.connect(self.save)
        saveAsAction = fileMenu.addAction('Save as...')
        saveAsAction.triggered.connect(self.saveAs)

        self.editor = QtWidgets.QTextEdit()
        self.setCentralWidget(self.editor)
        self.editor.document().modificationChanged.connect(self.setWindowModified)
        self.fileName = None

    def save(self):
        if not self.isWindowModified():
            return
        if not self.fileName:
            self.saveAs()
        else:
            with open(self.fileName, 'w') as f:
                f.write(self.editor.toPlainText())

    def saveAs(self):
        if not self.isWindowModified():
            return
        options = QtWidgets.QFileDialog.Options()
        options |= QtWidgets.QFileDialog.DontUseNativeDialog
        fileName, _ = QtWidgets.QFileDialog.getSaveFileName(self, 
            "Save File", "", "All Files(*);;Text Files(*.txt)", options = options)
        if fileName:
            with open(fileName, 'w') as f:
                f.write(self.editor.toPlainText())
            self.fileName = fileName
            self.setWindowTitle(str(os.path.basename(fileName)) + " - Notepad Alpha[*]")