最近做界面,中心部件用的是QTableWidget,由于需要用到判断表格数据是否被修改的功能,所以求助了各位大牛。在大牛的帮助下使用了cellChanged,使得界面能正常运行。但发现只有对两个单元格进行编辑后才能触发信号cellChanged,不知是为什么,又应怎样解决?
我做的测试是这样的。运行代码后,对表格中的一个单元格进行了编辑,然后点击打开按钮,按自已的设计应弹出提示保存的对话框,但实际上没有弹出。也就是说cellChanged信号并没有触发。但是如果再对另一个单元格进行辑,再按打开按钮时,则可以正常地弹出提示保存的对话框。不知这是什么原因,请大牛们帮忙。
我现在只做打开按钮的测试,所以其它部分的代码还没有修改。
代码如下:
#!/usr/bin/env python
#coding=utf-8
import sip
sip.setapi('QVariant', 2)
from PyQt4 import QtCore, QtGui
import application_rc
class MainWindow(QtGui.QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.showMaximized()
self.table = QtGui.QTableWidget()
self.setCentralWidget(self.table)
self.new_dirty()
self.table.cellChanged.connect(self.makeDirty)
self.createActions()
self.createMenus()
self.createToolBars()
self.createStatusBar()
def new_dirty(self):
self.dirty = False #创建新表格时,文档重新设置为未修改
def makeDirty(self):
self.dirty = True
def open(self):
if self.maybeSave():#maybeSave()用来判断当前已修改的文件是否进行了保存
fileName = QtGui.QFileDialog.getOpenFileName(self)
if fileName:
self.loadFile(fileName)
#函数作用:点击打开选项实现的方法(槽)
#点击打开文本,先判断当前已经打开的文本是否保存
#如果保存了,就跳出文件对话框,输入要打开的文件名,并把该文件名赋值给fileName,fileName不为空,打开该文件
def saveAs(self):
fileName = QtGui.QFileDialog.getSaveFileName(self)
if fileName:
return self.saveFile(fileName)
return False
#函数作用:点击另存为选项实现的方法
#点击另存为跳出文件对话框,输入另存为名字并把改名字赋值给fileName
#如果没输入另存为名字而是选择了取消,返回false
#如果输入,用这个名字保存文本
def createActions(self):
self.openAct = QtGui.QAction(QtGui.QIcon(':/images/open.png'),
"打开(&O)...", self, shortcut=QtGui.QKeySequence.Open,
statusTip="打开一个现存的文档", triggered=self.open)
self.saveAsAct = QtGui.QAction(QtGui.QIcon(':/images/save.png'),"另存为(&A)...", self,
shortcut=QtGui.QKeySequence.SaveAs,
statusTip="用新名称保存该活动文档",
triggered=self.saveAs)
self.exitAct = QtGui.QAction("退出(&X)", self, shortcut="Ctrl+Q",
statusTip="退出程序,提示保存文档", triggered=self.close)
def createMenus(self):
self.fileMenu = self.menuBar().addMenu("文件(&F)")
self.fileMenu.addAction(self.openAct)
self.fileMenu.addAction(self.saveAsAct)
self.fileMenu.addSeparator();
self.fileMenu.addAction(self.exitAct)
def createToolBars(self):
self.fileToolBar = self.addToolBar("File")
self.fileToolBar.addAction(self.openAct)
self.fileToolBar.addAction(self.saveAsAct)
def createStatusBar(self):
self.statusBar().showMessage("Ready")
def maybeSave(self):#函数作用:判断文件是否保存了
if self.dirty:#调用 Add、Clear、Insert 或 Remove 方法后,IsModified 属性为 true。 此外,使用 Item 属性修改字符串集合的元素后,IsModified 属性也为 true。
#是判断内容是否被修改,如果被修改就跳出一个警告对话框,问是否保存、忽略、取消。
ret = QtGui.QMessageBox.warning(self, "supermemo伴侣 (鱼版)",
"文本内容已经被修改\n你想保存被修改的内容吗?",
QtGui.QMessageBox.Save | QtGui.QMessageBox.Discard |
QtGui.QMessageBox.Cancel)
if ret == QtGui.QMessageBox.Save:
return self.save()#如果选择保存,执行保存方法;
elif ret == QtGui.QMessageBox.Cancel:
return False#如果选择取消,返回false
return True#如果没被修改,返回true
#判断文件是否保存函数maybeSave()的返回值如下:
#1、如果文件保存过了,也就是没被修改,则返回True
#2、如果文件被修改过了,并且在弹出的警告对话框中选择了取消,则返回False
#3、如果文件被修改过了,并且在弹出的警告对话框中选择了保存,则不返回任何值,直接执行保存函数self.save()
def saveFile(self, fileName):
f = open(fileName,"a",encoding="utf-8")
self.table.rowCount()
file = QtCore.QFile(fileName)
if not file.open(QtCore.QFile.WriteOnly | QtCore.QFile.Text):
QtGui.QMessageBox.warning(self, "Application",
"Cannot write file %s:\n%s." % (fileName, file.errorString()))
return False
outf = QtCore.QTextStream(file)
QtGui.QApplication.setOverrideCursor(QtCore.Qt.WaitCursor)
outf << self.textEdit.toPlainText()
QtGui.QApplication.restoreOverrideCursor()
self.setCurrentFile(fileName);
self.statusBar().showMessage("File saved", 2000)
return True
def loadFile(self, fileName):
file = open(fileName,"r")
content = file.readlines()#形成列表content
m = len(content)
n = content[0].count("\t")
self.table.setRowCount(m);
self.table.setColumnCount(n+1)
self.table.horizontalHeader().setMovable(True)
self.table.setStyleSheet("gridline-color: rgb(255, 0, 0)")
self.table.setStyleSheet("QTableWidget::item{border:1px solid red;}")
self.table.setShowGrid(False)
s = -1
for line in content :#在content中取出原文本中每一行的内容
s = s + 1
line_split = line.split("\t")#对原文本中一行的内容用制表符分割
k = 0
for line_part in line_split :#取出line_split列表中的内容
newItem = QtGui.QTableWidgetItem(line_part)
#textFont = QFont("Lucida Sans Unicode", 1, QFont.Bold)
#newItem.setFont(textFont)
self.table.setItem(s, k, newItem)
k = k + 1
if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
#QFontDatabase.addApplicationFont("./Lucida Sans Unicode")
mainWin = MainWindow()
mainWin.show()
sys.exit(app.exec_())