• 9179阅读
  • 1回复

[提问]pyqt中cellChanged信号需要在tablewidget中编辑两次才能触发 [复制链接]

上一主题 下一主题
离线xsqxsy
 

只看楼主 倒序阅读 楼主  发表于: 2012-09-13
        最近做界面,中心部件用的是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_())


离线XChinux

只看该作者 1楼 发表于: 2012-09-14
问题描述不清。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
快速回复
限100 字节
 
上一个 下一个