Exemplo n.º 1
0
Arquivo: graham.py Projeto: OGKG/CGApp
    def fillTable(self):
        table = self.stageResults[2]

        if not self.tableView:
            tableView = QTableView()
            model = QStandardItemModel(len(table), 4)
            model.setHeaderData(0, Qt.Horizontal, "Трійка")
            model.setHeaderData(1, Qt.Horizontal, "Кут")
            model.setHeaderData(2, Qt.Horizontal, "Точка")
            model.setHeaderData(3, Qt.Horizontal, "Дія над точкою")
            tableView.setModel(model)
            self.tableView = tableView
            self.tableLayout.addWidget(tableView)

        model = self.tableView.model()

        if len(table) > model.rowCount():
            model.insertRows(model.rowCount() - 1,
                             len(table) - model.rowCount(), QModelIndex())
        if len(table) < model.rowCount():
            model.removeRows(model.rowCount() - 1,
                             model.rowCount() - len(table), QModelIndex())

        for row in range(model.rowCount()):
            triple = str(table[row][0][0]) +\
                "-" + str(table[row][0][1]) +\
                "-" + str(table[row][0][2])
            angle = "<π" if table[row][1] else "⩾π"
            point = table[row][2]
            action = "Додати" if table[row][1] else "Видалити"
            data = [triple, angle, point, action]

            for col in range(model.columnCount()):
                index = model.index(row, col)
                model.setData(index, data[col])
Exemplo n.º 2
0
    def showSchema(self, table):
        """
        Public slot to show the schema of a table.
        
        @param table name of the table to be shown (string)
        """
        rec = self.connections.currentDatabase().record(table)
        model = QStandardItemModel(self.table)

        model.insertRows(0, rec.count())
        model.insertColumns(0, 7)

        model.setHeaderData(0, Qt.Horizontal, "Fieldname")
        model.setHeaderData(1, Qt.Horizontal, "Type")
        model.setHeaderData(2, Qt.Horizontal, "Length")
        model.setHeaderData(3, Qt.Horizontal, "Precision")
        model.setHeaderData(4, Qt.Horizontal, "Required")
        model.setHeaderData(5, Qt.Horizontal, "Auto Value")
        model.setHeaderData(6, Qt.Horizontal, "Default Value")

        for i in range(rec.count()):
            fld = rec.field(i)
            model.setData(model.index(i, 0), fld.name())
            if fld.typeID() == -1:
                model.setData(model.index(i, 1),
                              QVariant.typeToName(fld.type()))
            else:
                model.setData(
                    model.index(i, 1),
                    "{0} ({1})".format(QVariant.typeToName(fld.type()),
                                       fld.typeID()))
            if fld.length() < 0:
                model.setData(model.index(i, 2), "?")
            else:
                model.setData(model.index(i, 2), fld.length())
            if fld.precision() < 0:
                model.setData(model.index(i, 3), "?")
            else:
                model.setData(model.index(i, 3), fld.precision())
            if fld.requiredStatus() == -1:
                model.setData(model.index(i, 4), "?")
            else:
                model.setData(model.index(i, 4), bool(fld.requiredStatus()))
            model.setData(model.index(i, 5), fld.isAutoValue())
            model.setData(model.index(i, 6), fld.defaultValue())

        self.table.setModel(model)
        self.table.setEditTriggers(QAbstractItemView.NoEditTriggers)

        self.table.resizeColumnsToContents()

        self.updateActions()
Exemplo n.º 3
0
 def showSchema(self, table):
     """
     Public slot to show the schema of a table.
     
     @param table name of the table to be shown (string)
     """
     rec = self.connections.currentDatabase().record(table)
     model = QStandardItemModel(self.table)
     
     model.insertRows(0, rec.count())
     model.insertColumns(0, 7)
     
     model.setHeaderData(0, Qt.Horizontal, "Fieldname")
     model.setHeaderData(1, Qt.Horizontal, "Type")
     model.setHeaderData(2, Qt.Horizontal, "Length")
     model.setHeaderData(3, Qt.Horizontal, "Precision")
     model.setHeaderData(4, Qt.Horizontal, "Required")
     model.setHeaderData(5, Qt.Horizontal, "Auto Value")
     model.setHeaderData(6, Qt.Horizontal, "Default Value")
     
     for i in range(rec.count()):
         fld = rec.field(i)
         model.setData(model.index(i, 0), fld.name())
         if fld.typeID() == -1:
             model.setData(model.index(i, 1),
                           QVariant.typeToName(fld.type()))
         else:
             model.setData(
                 model.index(i, 1), "{0} ({1})".format(
                     QVariant.typeToName(fld.type()), fld.typeID()))
         if fld.length() < 0:
             model.setData(model.index(i, 2), "?")
         else:
             model.setData(model.index(i, 2), fld.length())
         if fld.precision() < 0:
             model.setData(model.index(i, 3), "?")
         else:
             model.setData(model.index(i, 3), fld.precision())
         if fld.requiredStatus() == -1:
             model.setData(model.index(i, 4), "?")
         else:
             model.setData(model.index(i, 4), bool(fld.requiredStatus()))
         model.setData(model.index(i, 5), fld.isAutoValue())
         model.setData(model.index(i, 6), fld.defaultValue())
     
     self.table.setModel(model)
     self.table.setEditTriggers(QAbstractItemView.NoEditTriggers)
     
     self.table.resizeColumnsToContents()
     
     self.updateActions()
Exemplo n.º 4
0
class ReaderExcelThread(QThread):
    standarModel_signal = pyqtSignal(QStandardItemModel)
    # sqlTableModel_signal = pyqtSignal(QSqlTableModel)
    progressRate_signal = pyqtSignal(str)
    finished_signal = pyqtSignal()

    # '''
    # 读取表格的方式分为两种:
    # 1.读取后直接使用,即直接设置并返回为QStandardItemModel
    # 2.读取后放到缓存数据库,从数据库中取数据,返回QSqlTableModel
    # '''
    def __init__(self, file_name, operate_way=1):
        super().__init__()
        self.file_name = file_name
        self.operate_way = operate_way
        self.model = QStandardItemModel()

    def run(self):
        # 这里读取数据返回列表便于表格中数据的更新
        self.progressRate_signal.emit("数据载入准备中...")
        data_list = read_excel(self.file_name)
        if data_list == -1:
            return
        print('start work!')
        cnt = len(data_list)
        for i, rows in enumerate(data_list):
            row = [QStandardItem(str(cell)) for cell in rows]
            self.model.appendRow(row)
            percent = int(i / cnt * 100 + 0.5)
            self.progressRate_signal.emit("数据载入进度:{}%".format(percent))

        #自动填满,这样更加美观(不过增加了后期数据处理难度!)
        while self.model.rowCount() < 22:
            self.model.insertRows(self.model.rowCount(), 1)
        while self.model.columnCount() < 15:
            self.model.insertColumns(self.model.columnCount(), 1)

        #数据加载完成
        self.progressRate_signal.emit("数据载入进度:100%")
        self.standarModel_signal.emit(self.model)
        print('send finised')
        self.finished_signal.emit()
Exemplo n.º 5
0
class BatchPfmonTable(QWidget):
    def __init__(self, sheet):
        self.group = SheetForm.REFER
        QWidget.__init__(self)
        self.ui = Ui_Form_SpreadSheet()
        self.ui.setupUi(self)
        self.updateTable(sheet)

    def updateTable(self, sheet):
        counters = sheet.selCounters[self.group]
        batches = sheet.selBatches[self.group]
        values = sheet.orgCounters[self.group]
        num_b = len(batches)
        rows = len(counters)
        self.model = QStandardItemModel(rows, num_b + 1, self)
        self.model.setHeaderData(0, Qt.Horizontal, 'Counters')

        x = 1
        for h in batches:
            self.model.setHeaderData(x, Qt.Horizontal, str(h))
            x += 1
        #self.ui.tableView_pfmonBatchTable.setModel(self.model)

        x = 1
        y = 0
        for cnt in counters:
            self.model.insertRows(y, 1, QModelIndex())
            #self.model.insertRow(y,1)
            self.model.setData(self.model.index(y, 0, QModelIndex()), cnt)
            for b in range(num_b):
                self.model.setData(self.model.index(y, x, QModelIndex()),
                                   values[cnt][b])

                x += 1
            y += 1
            x = 1

        self.ui.tableView_pfmonBatchTable.setModel(self.model)
Exemplo n.º 6
0
class E5NetworkMonitor(QDialog, Ui_E5NetworkMonitor):
    """
    Class implementing a network monitor dialog.
    """
    _monitor = None
    
    @classmethod
    def instance(cls, networkAccessManager):
        """
        Class method to get a reference to our singleton.
        
        @param networkAccessManager reference to the network access manager
            (QNetworkAccessManager)
        @return reference to the network monitor singleton (E5NetworkMonitor)
        """
        if cls._monitor is None:
            cls._monitor = E5NetworkMonitor(networkAccessManager)
        
        return cls._monitor
    
    @classmethod
    def closeMonitor(cls):
        """
        Class method to close the monitor dialog.
        """
        if cls._monitor is not None:
            cls._monitor.close()
    
    def __init__(self, networkAccessManager, parent=None):
        """
        Constructor
        
        @param networkAccessManager reference to the network access manager
            (QNetworkAccessManager)
        @param parent reference to the parent widget (QWidget)
        """
        super(E5NetworkMonitor, self).__init__(parent)
        self.setupUi(self)
        
        self.__requestHeaders = QStandardItemModel(self)
        self.__requestHeaders.setHorizontalHeaderLabels(
            [self.tr("Name"), self.tr("Value")])
        self.requestHeadersList.setModel(self.__requestHeaders)
        self.requestHeadersList.horizontalHeader().setStretchLastSection(True)
        self.requestHeadersList.doubleClicked.connect(self.__showHeaderDetails)
        
        self.__replyHeaders = QStandardItemModel(self)
        self.__replyHeaders.setHorizontalHeaderLabels(
            [self.tr("Name"), self.tr("Value")])
        self.responseHeadersList.setModel(self.__replyHeaders)
        self.responseHeadersList.horizontalHeader().setStretchLastSection(True)
        self.responseHeadersList.doubleClicked.connect(
            self.__showHeaderDetails)
        
        self.requestsList.horizontalHeader().setStretchLastSection(True)
        self.requestsList.verticalHeader().setMinimumSectionSize(-1)
        
        self.__proxyModel = QSortFilterProxyModel(self)
        self.__proxyModel.setFilterKeyColumn(-1)
        self.searchEdit.textChanged.connect(
            self.__proxyModel.setFilterFixedString)
        
        self.removeButton.clicked.connect(self.requestsList.removeSelected)
        self.removeAllButton.clicked.connect(self.requestsList.removeAll)
        
        self.__model = E5RequestModel(networkAccessManager, self)
        self.__proxyModel.setSourceModel(self.__model)
        self.requestsList.setModel(self.__proxyModel)
        self.__proxyModel.rowsInserted.connect(
            self.requestsList.scrollToBottom)
        self.requestsList.selectionModel()\
            .currentChanged[QModelIndex, QModelIndex]\
            .connect(self.__currentChanged)
        
        fm = self.fontMetrics()
        em = fm.width("m")
        self.requestsList.horizontalHeader().resizeSection(0, em * 5)
        self.requestsList.horizontalHeader().resizeSection(1, em * 20)
        self.requestsList.horizontalHeader().resizeSection(3, em * 5)
        self.requestsList.horizontalHeader().resizeSection(4, em * 15)
        
        self.__headersDlg = None
    
    def closeEvent(self, evt):
        """
        Protected method called upon closing the dialog.
        
        @param evt reference to the close event object (QCloseEvent)
        """
        self.__class__._monitor = None
        super(E5NetworkMonitor, self).closeEvent(evt)
    
    def reject(self):
        """
        Public slot to close the dialog with a Reject status.
        """
        self.__class__._monitor = None
        super(E5NetworkMonitor, self).reject()
    
    def __currentChanged(self, current, previous):
        """
        Private slot to handle a change of the current index.
        
        @param current new current index (QModelIndex)
        @param previous old current index (QModelIndex)
        """
        self.__requestHeaders.setRowCount(0)
        self.__replyHeaders.setRowCount(0)
        
        if not current.isValid():
            return
        
        row = self.__proxyModel.mapToSource(current).row()
        
        req = self.__model.requests[row].request
        
        for header in req.rawHeaderList():
            self.__requestHeaders.insertRows(0, 1, QModelIndex())
            self.__requestHeaders.setData(
                self.__requestHeaders.index(0, 0),
                str(header, "utf-8"))
            self.__requestHeaders.setData(
                self.__requestHeaders.index(0, 1),
                str(req.rawHeader(header), "utf-8"))
            self.__requestHeaders.item(0, 0).setFlags(
                Qt.ItemIsSelectable | Qt.ItemIsEnabled)
            self.__requestHeaders.item(0, 1).setFlags(
                Qt.ItemIsSelectable | Qt.ItemIsEnabled)
        
        for header in self.__model.requests[row].replyHeaders:
            self.__replyHeaders.insertRows(0, 1, QModelIndex())
            self.__replyHeaders.setData(
                self.__replyHeaders.index(0, 0),
                header[0])
            self.__replyHeaders.setData(
                self.__replyHeaders.index(0, 1),
                header[1])
            self.__replyHeaders.item(0, 0).setFlags(
                Qt.ItemIsSelectable | Qt.ItemIsEnabled)
            self.__replyHeaders.item(0, 1).setFlags(
                Qt.ItemIsSelectable | Qt.ItemIsEnabled)
    
    def __showHeaderDetails(self, index):
        """
        Private slot to show a dialog with the header details.
        
        @param index index of the entry to show (QModelIndex)
        """
        if not index.isValid():
            return
        
        headerList = self.sender()
        if headerList is None:
            return
        
        row = index.row()
        name = headerList.model().data(headerList.model().index(row, 0))
        value = headerList.model().data(headerList.model().index(row, 1))
        if self.__headersDlg is None:
            from .E5NetworkHeaderDetailsDialog import \
                E5NetworkHeaderDetailsDialog
            self.__headersDlg = E5NetworkHeaderDetailsDialog(self)
        self.__headersDlg.setData(name, value)
        self.__headersDlg.show()
Exemplo n.º 7
0
class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()

        fileMenu = QMenu("&File", self)
        openAction = fileMenu.addAction("&Open...")
        openAction.setShortcut("Ctrl+O")
        saveAction = fileMenu.addAction("&Save As...")
        saveAction.setShortcut("Ctrl+S")
        quitAction = fileMenu.addAction("E&xit")
        quitAction.setShortcut("Ctrl+Q")

        self.setupModel()
        self.setupViews()

        openAction.triggered.connect(self.openFile)
        saveAction.triggered.connect(self.saveFile)
        quitAction.triggered.connect(QApplication.instance().quit)

        self.menuBar().addMenu(fileMenu)
        self.statusBar()

        self.openFile(':/Charts/qtdata.cht')

        self.setWindowTitle("Chart")
        self.resize(870, 550)

    def setupModel(self):
        self.model = QStandardItemModel(8, 2, self)
        self.model.setHeaderData(0, Qt.Horizontal, "Label")
        self.model.setHeaderData(1, Qt.Horizontal, "Quantity")

    def setupViews(self):
        splitter = QSplitter()
        table = QTableView()
        self.pieChart = PieView()
        splitter.addWidget(table)
        splitter.addWidget(self.pieChart)
        splitter.setStretchFactor(0, 0)
        splitter.setStretchFactor(1, 1)

        table.setModel(self.model)
        self.pieChart.setModel(self.model)

        self.selectionModel = QItemSelectionModel(self.model)
        table.setSelectionModel(self.selectionModel)
        self.pieChart.setSelectionModel(self.selectionModel)

        table.horizontalHeader().setStretchLastSection(True)

        self.setCentralWidget(splitter)

    def openFile(self, path=None):
        if not path:
            path, _ = QFileDialog.getOpenFileName(self, "Choose a data file",
                                                  '', '*.cht')

        if path:
            f = QFile(path)

            if f.open(QFile.ReadOnly | QFile.Text):
                stream = QTextStream(f)

                self.model.removeRows(0, self.model.rowCount(QModelIndex()),
                                      QModelIndex())

                row = 0
                line = stream.readLine()
                while line:
                    self.model.insertRows(row, 1, QModelIndex())

                    pieces = line.split(',')
                    self.model.setData(self.model.index(row, 0, QModelIndex()),
                                       pieces[0])
                    self.model.setData(self.model.index(row, 1, QModelIndex()),
                                       float(pieces[1]))
                    self.model.setData(self.model.index(row, 0, QModelIndex()),
                                       QColor(pieces[2]), Qt.DecorationRole)

                    row += 1
                    line = stream.readLine()

                f.close()
                self.statusBar().showMessage("Loaded %s" % path, 2000)

    def saveFile(self):
        fileName, _ = QFileDialog.getSaveFileName(self, "Save file as", '',
                                                  '*.cht')

        if fileName:
            f = QFile(fileName)

            if f.open(QFile.WriteOnly | QFile.Text):
                for row in range(self.model.rowCount(QModelIndex())):
                    pieces = []

                    pieces.append(
                        self.model.data(
                            self.model.index(row, 0, QModelIndex()),
                            Qt.DisplayRole))
                    pieces.append(
                        str(
                            self.model.data(
                                self.model.index(row, 1, QModelIndex()),
                                Qt.DisplayRole)))
                    pieces.append(
                        self.model.data(
                            self.model.index(row, 0, QModelIndex()),
                            Qt.DecorationRole).name())

                    f.write(QByteArray(','.join(pieces)))
                    f.write('\n')

            f.close()
            self.statusBar().showMessage("Saved %s" % fileName, 2000)
Exemplo n.º 8
0
class MainWindow(QMainWindow):
    def __init__(self,system):
        super(MainWindow, self).__init__()

        self.system = system
        fileMenu = QMenu("&Menu", self)
        dbinitAction = fileMenu.addAction("사용자 정보 초기화")
        quitAction = fileMenu.addAction("E&xit")
        quitAction.setShortcut("Ctrl+Q")

        self.menuBar().addMenu(fileMenu)
        self.statusBar()

        dbinitAction.triggered.connect(self.ClickAction_dbinit)
        quitAction.triggered.connect(QApplication.instance().quit)

        self.setupModel()
        self.setupViews()
        self.readDB()



        self.setWindowTitle("PyStudy 학습진도창")
        self.resize(870, 550)

    def setupModel(self):
        self.model = QStandardItemModel(3, 2, self)
        self.model.setHeaderData(0, Qt.Horizontal, "목록")
        self.model.setHeaderData(1, Qt.Horizontal, "읽기여부")
        self.model2 = QStandardItemModel(3, 2, self)
        self.model2.setHeaderData(0, Qt.Horizontal, "학습여부")
        self.model2.setHeaderData(1, Qt.Horizontal, "개수")


    def setupViews(self):
        splitter = QSplitter()
        self.table = QTableView()
        self.pieChart = PieView()


        splitter.addWidget(self.pieChart)
        splitter.addWidget(self.table)
        splitter.setStretchFactor(0, 0)
        splitter.setStretchFactor(1, 0)

        self.table.setModel(self.model)
        self.pieChart.setModel(self.model2)

        self.selectionModel = QItemSelectionModel(self.model2)
        self.table.setSelectionModel(self.selectionModel)

        #self.pieChart.setSelectionModel(self.selectionModel)

        #table.setColumnWidth(0,100)
        self.setCentralWidget(splitter)
        self.table.doubleClicked.connect(self.ClickAction_table)

    def readDB(self):

        con = sqlite3.connect("mystudy.db")
        cur = con.cursor()
        cur.execute("select subject, readcheck from study;")
        self.model.removeRows(0, self.model.rowCount(QModelIndex()),
                        QModelIndex())
        self.model2.removeRows(0, self.model2.rowCount(QModelIndex()),
                        QModelIndex())
        row = 0
        for line in cur:
            if line[1] ==1:
                result = "○"
            else:
                result = "X"
            self.model.insertRows(row, 1, QModelIndex())
            self.model.setData(self.model.index(row, 0, QModelIndex()), line[0])
            self.model.setData(self.model.index(row, 1, QModelIndex()),result)
            self.model.setData(self.model.index(row, 1, QModelIndex()), QVariant(Qt.AlignCenter),Qt.TextAlignmentRole)
            row += 1
        cur.execute("select count() from study ;")
        for line in cur:
            self.studyTotal =line[0]
        cur.execute("select count() from study where readcheck=1;")
        for line in cur:
            self.studyRead =line[0]
        #print("총 개수 " ,self.studyTotal ," 학습한개수", self.studyRead )
        con.close()
        row=0
        self.model2.insertRows(row, 1, QModelIndex())
        self.model2.setData(self.model2.index(row, 0, QModelIndex()),"학습")
        self.model2.setData(self.model2.index(row, 1, QModelIndex()), float(self.studyRead))
        self.model2.setData(self.model2.index(row, 0, QModelIndex()), QColor("#99e600"), Qt.DecorationRole)
        row=1
        self.model2.insertRows(row, 1, QModelIndex())
        self.model2.setData(self.model2.index(row, 0, QModelIndex()),"미학습")
        self.model2.setData(self.model2.index(row, 1, QModelIndex()), float(self.studyTotal-self.studyRead))
        self.model2.setData(self.model2.index(row, 0, QModelIndex()), QColor("#8080b3"), Qt.DecorationRole)


        self.table.setSelectionBehavior(QAbstractItemView.SelectRows)
        self.table.setSelectionMode(QAbstractItemView.SingleSelection)
        self.table.setDragEnabled(False)
        self.table.horizontalHeader().setStretchLastSection(True)
        self.table.setEditTriggers(QAbstractItemView.NoEditTriggers)
        self.table.resizeRowsToContents()
        self.table.resizeColumnsToContents()
        self.table.setColumnWidth(0,350)
                    #self.statusBar().showMessage("Loaded %s" % path, 2000)
    def ClickAction_table(self,index):
        #self.system
        #index.data()
        #self.table.selectedIndexes()[0].data()
        tempstr = self.table.selectedIndexes()[0].data().split()
        filepath = r"PyStudy_web\\example\\기본예제\\"+tempstr[0]+".html"
        selectedRowKey = self.table.selectedIndexes()[0].row()+1#mysql 테이블 줄수 차이
        #print("click test ",selectedRowKey )
        con = sqlite3.connect("mystudy.db")
        cur = con.cursor()
        cur.execute("update 'study' set 'readcheck'=1 where key="+str(selectedRowKey)+";")
        con.commit()
        con.close()
        self.setupViews()
        self.readDB()

        self.system.sendMessage("/학습창 열기 "+filepath)
    def ClickAction_dbinit(self,index):
        con = sqlite3.connect("mystudy.db")
        cur = con.cursor()
        cur.execute("update 'study' set 'readcheck'=0 ;")
        con.commit()
        con.close()
        self.setupViews()
        self.readDB()
Exemplo n.º 9
0
class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()

        fileMenu = QMenu("&File", self)
        openAction = fileMenu.addAction("&Open...")
        openAction.setShortcut("Ctrl+O")
        saveAction = fileMenu.addAction("&Save As...")
        saveAction.setShortcut("Ctrl+S")
        quitAction = fileMenu.addAction("E&xit")
        quitAction.setShortcut("Ctrl+Q")

        self.setupModel()
        self.setupViews()

        openAction.triggered.connect(self.openFile)
        saveAction.triggered.connect(self.saveFile)
        quitAction.triggered.connect(QApplication.instance().quit)

        self.menuBar().addMenu(fileMenu)
        self.statusBar()

        self.openFile(':/Charts/qtdata.cht')

        self.setWindowTitle("Chart")
        self.resize(870, 550)

    def setupModel(self):
        self.model = QStandardItemModel(8, 2, self)
        self.model.setHeaderData(0, Qt.Horizontal, "Label")
        self.model.setHeaderData(1, Qt.Horizontal, "Quantity")

    def setupViews(self):
        splitter = QSplitter()
        table = QTableView()
        self.pieChart = PieView()
        splitter.addWidget(table)
        splitter.addWidget(self.pieChart)
        splitter.setStretchFactor(0, 0)
        splitter.setStretchFactor(1, 1)

        table.setModel(self.model)
        self.pieChart.setModel(self.model)

        self.selectionModel = QItemSelectionModel(self.model)
        table.setSelectionModel(self.selectionModel)
        self.pieChart.setSelectionModel(self.selectionModel)

        table.horizontalHeader().setStretchLastSection(True)

        self.setCentralWidget(splitter)

    def openFile(self, path=None):
        if not path:
            path, _ = QFileDialog.getOpenFileName(self, "Choose a data file",
                    '', '*.cht')

        if path:
            f = QFile(path)

            if f.open(QFile.ReadOnly | QFile.Text):
                stream = QTextStream(f)

                self.model.removeRows(0, self.model.rowCount(QModelIndex()),
                        QModelIndex())

                row = 0
                line = stream.readLine()
                while line:
                    self.model.insertRows(row, 1, QModelIndex())

                    pieces = line.split(',')
                    self.model.setData(self.model.index(row, 0, QModelIndex()),
                                pieces[0])
                    self.model.setData(self.model.index(row, 1, QModelIndex()),
                                float(pieces[1]))
                    self.model.setData(self.model.index(row, 0, QModelIndex()),
                                QColor(pieces[2]), Qt.DecorationRole)

                    row += 1
                    line = stream.readLine()

                f.close()
                self.statusBar().showMessage("Loaded %s" % path, 2000)

    def saveFile(self):
        fileName, _ = QFileDialog.getSaveFileName(self, "Save file as", '',
                '*.cht')

        if fileName:
            f = QFile(fileName)

            if f.open(QFile.WriteOnly | QFile.Text):
                for row in range(self.model.rowCount(QModelIndex())):
                    pieces = []

                    pieces.append(self.model.data(self.model.index(row, 0, QModelIndex()),
                            Qt.DisplayRole))
                    pieces.append(str(self.model.data(self.model.index(row, 1, QModelIndex()),
                            Qt.DisplayRole)))
                    pieces.append(self.model.data(self.model.index(row, 0, QModelIndex()),
                            Qt.DecorationRole).name())

                    f.write(QByteArray(','.join(pieces)))
                    f.write('\n')

            f.close()
            self.statusBar().showMessage("Saved %s" % fileName, 2000)
Exemplo n.º 10
0
class CraftBar(QDialog, Ui_B_CraftBar):
    def __init__(self, parent=None, name=None, modal=False, fl=Qt.Widget):
        QDialog.__init__(self, parent, fl)
        Ui_B_CraftBar.setupUi(self, self)

        # TODO: CENTER CLIENT, SERVER, AND CRAFTER DATA
        # TODO: MAKE DIALOG RESIZEABLE, CURRENTLY NOT POSSIBLE
        self.model = QStandardItemModel(0, 3)
        self.model.setHeaderData(0, Qt.Horizontal, QVariant('Client'),
                                 Qt.DisplayRole)
        self.model.setHeaderData(1, Qt.Horizontal, QVariant('Server'),
                                 Qt.DisplayRole)
        self.model.setHeaderData(2, Qt.Horizontal, QVariant('Crafter'),
                                 Qt.DisplayRole)
        self.CharList.setModel(self.model)
        self.CharList.setEditTriggers(QAbstractItemView.NoEditTriggers)
        self.CharList.setShowGrid(False)
        self.CharList.verticalHeader().hide()
        self.CharList.horizontalHeader().setSectionResizeMode(
            QHeaderView.Stretch)
        self.CharList.setSelectionBehavior(QAbstractItemView.SelectRows)
        self.CharList.setSelectionMode(QAbstractItemView.SingleSelection)

        if name:
            self.setObjectName(name)

        if modal:
            self.setModal(modal)

        self.parent = parent
        self.gemcount = 0
        self.piecelist = {}

        self.ItemSelect = [
            self.ChestSelect, self.ArmsSelect, self.HeadSelect,
            self.LegsSelect, self.FeetSelect, self.HandsSelect,
            self.SpareSelect, self.RHSelect, self.LHSelect, self.THSelect,
            self.RangedSelect
        ]

        self.items = [
            'Chest', 'Arms', 'Head', 'Legs', 'Feet', 'Hands', 'Spare',
            'Right Hand', 'Left Hand', '2 Handed', 'Ranged'
        ]

        self.reini = re.compile('(\w+)-(\d+)\.ini$')
        self.resec = re.compile('\[(\w+)\]')
        self.rectl = re.compile('[Hh]otkey_(\d+)=44,13,')

        self.PathSelectButton.clicked.connect(self.openFileDialog)
        self.PushButton19.clicked.connect(self.accept)
        self.LoadGemsButton.clicked.connect(self.loadGems)
        self.DaocPath.textChanged[str].connect(self.findPath)
        self.HotbarNum.valueChanged[int].connect(self.hotbarNumChanged)
        self.HotbarRow.valueChanged[int].connect(self.hotbarNumChanged)
        self.HotbarPos.valueChanged[int].connect(self.hotbarNumChanged)
        self.CharList.selectionModel().selectionChanged.connect(
            self.charChanged)

        for i in range(0, len(self.ItemSelect)):
            self.ItemSelect[i].clicked.connect(self.pieceBoxChanged)
            item = self.parent.itemattrlist[self.items[i]]

            while item.ActiveState == 'drop' and item.next is not None:
                item = item.next

            if item.ActiveState == 'drop':
                self.ItemSelect[i].setEnabled(False)
                continue

            done = True
            unused = True

            for slot in item.slots():

                if slot.crafted():
                    unused = False

                    if slot.makes() == "0":
                        done = False
                        break

            if unused:
                self.ItemSelect[i].setEnabled(False)
                continue

            if not done and item == self.parent.itemattrlist[self.items[i]]:
                self.ItemSelect[i].setCheckState(Qt.Checked)

        self.HotbarNum.setValue(1)
        self.HotbarRow.setValue(1)
        self.HotbarPos.setValue(1)

        # TODO: REMOVE NON-WIN32 STUFF
        if sys.platform == 'win32':
            path = os.environ.get('APPDATA', '')

            if not os.path.isdir(path):
                path = os.environ.get('HOMEDRIVE', '')
                path = os.path.join(path, os.environ.get('HOMEPATH', ''))
                path = os.path.join(path, 'Application Data')

            path = os.path.join(path, 'Electronic Arts\Dark Age of Camelot')

        else:
            path = os.environ.get('HOME', '')

        self.DaocPath.setText(SCOptions.instance().getOption(
            'DaocIniPath', path))
        self.pieceBoxChanged()
        self.computeGemCount()
        self.computeBarEnd()

    def loadGems(self):
        indexList = self.CharList.selectedIndexes()

        if len(indexList) == 0:
            return

        for idx in indexList:

            if idx.column() == 0:
                server = str(idx.data())  # .toString())

        row = indexList[0].row()
        fileIndex = self.model.index(row, 0)
        filename = str(self.model.data(fileIndex, Qt.UserRole))  # .toString())

        self.LoadGemsButton.setEnabled(0)
        self.LoadGemsButton.update()

        f = open(filename)
        g = open(filename + '.bak', 'w')
        g.write(f.read())
        f.close()
        g.close()
        CP = IniConfigParser()
        CP.read([filename])
        buttons = [-1, -1, -1]
        newbuttons = []
        slotcounter = 0

        while slotcounter <= 99:

            try:
                buttonstr = CP.get('[Macros]', 'Macro_%d' % slotcounter)

            except:
                if len(newbuttons) < 3:
                    newbuttons.append(slotcounter)

            else:
                buttonval = str.split(buttonstr, ',', 1)

                if len(buttonval) > 1 and buttonval[1][:7].lower(
                ) == '/craft ':

                    if buttonval[1][7].lower() in "ahm":
                        buttons['ahm'.index(
                            buttonval[1][7].lower())] = slotcounter

            slotcounter += 1

        for i in (0, 1, 2):

            if buttons[i] < 0 and len(newbuttons) > 0:
                buttons[i] = newbuttons.pop(0)
                CP.set('Macros', 'Macro_%d' % buttons[i],
                       "%s,/craft %s" % (Realms[i][0:3], Realms[i]))

        realm = self.parent.realm
        slotcounter = (self.HotbarNum.value() - 1) * 100 + (
            self.HotbarRow.value() - 1) * 10 + self.HotbarPos.value() - 1
        startslot = slotcounter

        for loc in TabList:
            item = self.piecelist.get(loc, None)

            if item is None:
                continue

            if item.ActiveState == 'player':

                for slot in item.slots():

                    if slot.crafted():
                        gemname = slot.gemName(realm, 3)

                        if slotcounter >= 300:
                            sys.stdout.write("Out of slots!\n")
                            continue

                        if gemname not in HotkeyGems[realm]:
                            for i in (0, 1, 2):
                                gemname = slot.gemName(Realms[i], 3)

                                if realm == Realms[i]:
                                    continue

                                if gemname in HotkeyGems[Realms[i]]:
                                    realm = Realms[i]
                                    buttonstr = 'Hotkey_%d' % buttons[i]

                                    if slotcounter >= 200:
                                        CP.set('Quickbar3',
                                               'Hotkey_%d' % slotcounter - 200,
                                               buttonstr)

                                    elif slotcounter >= 100:
                                        CP.set('Quickbar2',
                                               'Hotkey_%d' % slotcounter - 100,
                                               buttonstr)

                                    else:
                                        CP.set('Quickbar',
                                               'Hotkey_%d' % slotcounter,
                                               buttonstr)

                                    slotcounter += 1
                                    break

                        if gemname in HotkeyGems[realm]:
                            val = HotkeyGems[realm][gemname]
                            buttonstr = '45,13%03d%02d,,-1' % (
                                val, slot.gemLevel() - 1)

                            if slotcounter >= 200:
                                CP.set('Quickbar3',
                                       'Hotkey_%d' % (slotcounter - 200),
                                       buttonstr)

                            elif slotcounter >= 100:
                                CP.set('Quickbar2',
                                       'Hotkey_%d' % (slotcounter - 100),
                                       buttonstr)

                            else:
                                CP.set('Quickbar', 'Hotkey_%d' % slotcounter,
                                       buttonstr)
                            slotcounter += 1

                        else:
                            sys.stdout.write(realm + " has no '" + gemname +
                                             "' gem\n")

        f = open(filename, 'w')
        CP.write(f)
        f.close()
        self.LabelNumGems.setText('Number of Quickbar Buttons Loaded:')
        self.NumGems.setText(str(slotcounter - startslot))
        self.HotbarNum.setValue(int(slotcounter / 100) + 1)
        self.HotbarRow.setValue(int(slotcounter / 10) % 10 + 1)
        self.HotbarPos.setValue(slotcounter % 10 + 1)
        self.piecelist = {}

        for ctl in self.ItemSelect:

            if ctl.checkState() == Qt.Checked:
                ctl.setCheckState(Qt.PartiallyChecked)

        self.gemcount = 0
        self.computeBarEnd()

    def findPath(self, rootpath):
        servers = ServerCodes

        self.model.removeRows(0, self.model.rowCount())
        rootpath = str(rootpath)

        if os.path.isdir(rootpath):
            filelist = glob.glob(rootpath + '/*-*.ini')
            filelist.extend(glob.glob(rootpath + '/*/*-*.ini'))
            filelist.extend(glob.glob(rootpath + '/*/*/*-*.ini'))

            for file in filelist:
                path = file[len(rootpath) + 1:]
                slash = path.rfind('/')
                slash = max(slash, path.rfind('\\'))
                m = self.reini.search(path[(slash + 1):])

                if slash < 0:
                    path = ''

                else:
                    path = path[:slash]

                if m is None or m.group(2) not in servers:
                    continue

                f = open(file, 'r')
                find = 0

                for txt in f:
                    sec = self.resec.match(txt)

                    if sec is not None:

                        if sec.group(1)[:8] == 'Quickbar':
                            find = 1

                        else:
                            find = 0

                        continue

                    if find == 1 and self.rectl.match(txt) is not None:
                        find = 2
                        break

                f.close()

                if find < 2:
                    continue

                server = servers[m.group(2)]
                self.model.insertRows(self.model.rowCount(), 1)
                index = self.model.index(self.model.rowCount() - 1, 0,
                                         QModelIndex())
                self.model.setData(index, QVariant(path), Qt.DisplayRole)
                self.model.setData(index, QVariant(file), Qt.UserRole)
                index = self.model.index(self.model.rowCount() - 1, 1,
                                         QModelIndex())
                self.model.setData(index, QVariant(server), Qt.DisplayRole)
                index = self.model.index(self.model.rowCount() - 1, 2,
                                         QModelIndex())
                self.model.setData(index, QVariant(m.group(1)), Qt.DisplayRole)

                if self.model.rowCount() == 1:
                    self.CharList.selectRow(0)

            if len(filelist) > 0:
                SCOptions.instance().setOption('DaocIniPath', rootpath)

        self.CharList.resizeRowsToContents()

    def openFileDialog(self):
        daocdir = QFileDialog.getExistingDirectory(self,
                                                   'Select DAoC Directory',
                                                   self.DaocPath.text())

        if daocdir:
            self.DaocPath.setText(os.path.abspath(str(daocdir)))

    def computeBarEnd(self):
        pos = (self.HotbarNum.value() - 1) * 100 + (
            self.HotbarRow.value() - 1) * 10 + self.HotbarPos.value() - 1
        eb = int((pos + self.gemcount - 1) / 100) + 1
        er = int((pos + self.gemcount - 1) / 10) % 10 + 1
        ep = (pos + self.gemcount - 1) % 10 + 1

        if eb > 3 or self.gemcount == 0:
            self.LoadGemsButton.setEnabled(0)
            self.LoadGemsButton.update()
            self.EndBar.setText('-')
            self.EndRow.setText('-')
            self.EndPos.setText('-')

        else:
            self.LoadGemsButton.setEnabled(
                len(self.CharList.selectedIndexes()) > 0)
            self.LoadGemsButton.update()
            self.EndBar.setText(str(eb))
            self.EndRow.setText(str(er))
            self.EndPos.setText(str(ep))

    def hotbarNumChanged(self, a0):
        self.computeBarEnd()

    def computeGemCount(self):
        self.gemcount = 0

        for loc, item in list(self.piecelist.items()):

            if item.ActiveState == 'player':

                for slot in item.slots():

                    if slot.crafted():
                        self.gemcount += 1

        self.LabelNumGems.setText('Total Number of Gems to Load:')
        self.NumGems.setText(str(self.gemcount))

    def pieceBoxChanged(self):
        self.piecelist = {}

        for i in range(0, len(self.ItemSelect)):

            if self.ItemSelect[i].checkState() == Qt.Checked:
                item = self.parent.itemattrlist[self.items[i]]

                while item.ActiveState == 'drop' and item.next is not None:
                    item = item.next

                self.piecelist[self.items[i]] = item

        self.computeGemCount()
        self.computeBarEnd()

    def charChanged(self, a1, a2):
        self.computeBarEnd()
Exemplo n.º 11
0
class CalcDialog(QDialog):
    """
    Bridges all events in QApplication CalcApp to caeroc.formulae
    TODO: Error handling
    """
    def __init__(self, parent=None):
        """Initialize scalar values which keep track of different options in
        the GUI and setup the application user interface.

        """
        super(CalcDialog, self).__init__(parent)

        self.ui = Ui_CalcDialog()
        self.ui.setupUi(self)
        # ----------Input------------
        self.key1 = self.ui.qcb1_input
        self.key2 = self.ui.qcb2_input
        self.input1 = 1.0
        self.input2 = 1.0
        self.gamma = 1.4
        self.autocalc = False
        self.mode = None
        self.on_qrb1_isen_pressed()
        # ---------Output------------
        self.table = self.ui.qtw_output
        self._setupModel()

        # -----Connect Signals-------
        self.autocalc = False
        if use_pyqt:
            self.ui.qcb_autocalc.setChecked(self.autocalc)
            self.ui.qcb_autocalc.stateChanged.connect(
                self.on_qcb_autocalc_stateChanged)

    def _setupModel(self):
        """Sets up the model or the table where the output is displayed."""
        self.model = QStandardItemModel(10, 2, self)
        self.model.setHeaderData(0, QtCore.Qt.Horizontal, "Parameter")
        self.model.setHeaderData(1, QtCore.Qt.Horizontal, "Value")

    def _set_keys_and_attrs(self, key1_to_attr, key2_to_attr,
                            extra_attr_to_key, **kwargs):
        """Reinitialize self.mode with an object of self.Mode - an alias for
        the formulae class. Also, clear the current options and add the related
        options for self.Mode.

        """

        if not isinstance(self.mode, self.Mode):
            self.key1.clear()
            self.key2.clear()
            self.key1_to_attr = key1_to_attr
            self.key2_to_attr = key2_to_attr
            self._set_attr_to_key(extra_attr_to_key)

            keys1 = self.key1_to_attr.keys()
            keys2 = self.key2_to_attr.keys()
            if not use_pyqt:
                keys1 = list(keys1)
                keys2 = list(keys2)

            self.key1.addItems(keys1)
            self.key2.addItems(keys2)

    def _set_mode(self, **kwargs):
        if not isinstance(self.mode, self.Mode):
            self.mode = self.Mode(gamma=self.gamma, **kwargs)
            logger.debug('MODE: {}'.format(self.mode.__doc__))

    def _set_attr_to_key(self, extra=None):
        self.attr_to_key = {v: k for k, v in self.key1_to_attr.items()}
        self.attr_to_key.update({v: k for k, v in self.key2_to_attr.items()})
        self.attr_to_key.update(extra)

    @Slot()
    def on_qrb1_isen_pressed(self):
        """Run when radio button Isentropic is pressed."""
        self.Mode = formulae.isentropic.Isentropic
        key1_to_attr = {
            'M': 'M',
            u'p/p\u2080': 'p_p0',
            u'ρ/ρ\u2080': 'rho_rho0',
            u'T/T\u2080': 'T_T0',
            'A/A*': 'A_Astar'
        }
        key2_to_attr = {'-': None}
        extra_attr_to_key = {
            'Mt': 'M*',
            'p_pt': 'p/p*',
            'rho_rhot': u'ρ/ρ*',
            'T_Tt': 'T/T*'
        }
        self._set_keys_and_attrs(key1_to_attr, key2_to_attr, extra_attr_to_key)
        self._set_mode()

    @Slot()
    def on_qrb2_expa_pressed(self):
        """Run when radio button Expansion is pressed."""
        self.Mode = formulae.isentropic.Expansion
        key1_to_attr = {u'θ (deg)': 'theta_deg', u'θ (rad)': 'theta_rad'}
        key2_to_attr = {u'M\u2081': 'M_1', u'ν\u2081 (rad)': 'nu_1'}
        extra_attr_to_key = {
            'theta': u'θ (rad)',
            'M_2': u'M\u2082',
            'nu_2': u'ν\u2082 (rad)',
            'p2_p1': u'p\u2082/p\u2081',
            'rho2_rho1': u'ρ\u2082/ρ\u2081',
            'T2_T1': u'T\u2082/T\u2081'
        }
        self._set_keys_and_attrs(key1_to_attr, key2_to_attr, extra_attr_to_key)
        self._set_mode()

    @Slot()
    def on_qrb3_norm_pressed(self):
        """Run when radio button Normal Shock is pressed."""
        self.Mode = formulae.shock.NormalShock
        key1_to_attr = {
            u'M\u2081': 'M_1',
            u'p\u2082/p\u2081': 'p2_p1',
            u'ρ\u2082/ρ\u2080': 'rho2_rho1',
            u'T\u2082/T\u2081': 'T2_T1'
        }
        key2_to_attr = {'-': None}
        extra_attr_to_key = {
            'M_2': u'M\u2082',
            'p02_p01': u'p0\u2082/p0\u2081',
            'rho02_rho01': u'ρ0\u2082/ρ0\u2080',
            'T02_T01': u'T0\u2082/T0\u2081'
        }

        self._set_keys_and_attrs(key1_to_attr, key2_to_attr, extra_attr_to_key)
        kwargs = dict()
        key1 = self.key1.currentText()
        attr1 = key1_to_attr[key1]
        kwargs[attr1] = self.input1
        self._set_mode(**kwargs)

    @Slot()
    def on_qrb4_obli_pressed(self):
        """Run when radio button Oblique Shock is pressed."""
        logger.warn('MODE:Oblique Shock not implemented')

    @Slot()
    def on_qrb5_fann_pressed(self):
        """Run when radio button Fanno Flow is pressed."""
        logger.warn('MODE:Fanno Flow not implemented')

    @Slot()
    def on_qrb6_rayl_pressed(self):
        """Run when radio button Rayleigh Flow is pressed."""
        logger.warn('MODE:Rayleigh Flow not implemented')

    @Slot(float)
    def on_qdsb1_input_valueChanged(self, value):
        """Run when input value in the 1st input QDoubleSpinBox changes."""
        self.input1 = value
        if self.autocalc:
            self.on_qpb_calculate_released()

    @Slot(float)
    def on_qdsb2_input_valueChanged(self, value):
        """Run when input value in the QDoubleSpinBox changes."""
        self.input2 = value
        if self.autocalc:
            self.on_qpb_calculate_released()

    @Slot(float)
    def on_qdsb_gamma_valueChanged(self, value):
        """Run when input value in the QDoubleSpinBox changes."""
        self.gamma = value
        del (self.mode)
        self.mode = self.Mode(gamma=value)
        if self.autocalc:
            self.on_qpb_calculate_released()

    @Slot()
    def on_qcb_autocalc_stateChanged(self):
        """Run when the AutoCalculate QCheckBox state changes."""
        self.autocalc = self.ui.qcb_autocalc.isChecked()
        logger.debug('Auto calculate: {}'.format(self.autocalc))

    @Slot()
    def on_qpb_calculate_released(self):
        """Remove the rows and update the model with new data.
        Runs when the QPushButton is pressed and released.

        """
        attr1 = self.key1_to_attr[self.key1.currentText()]
        attr2 = self.key2_to_attr[self.key2.currentText()]
        if attr2 is None:
            kwargs = {attr1: self.input1}
        else:
            kwargs = {attr1: self.input1, attr2: self.input2}

        logger.info(kwargs)
        self.mode.calculate(**kwargs)
        logger.info(self.mode.data)

        # ------ Fill table --------------
        self.model.removeRows(0, self.model.rowCount(QtCore.QModelIndex()),
                              QtCore.QModelIndex())
        row = 0
        for attr in self.mode.keys:
            if self.mode.data[attr]:  # Not empty
                self.model.insertRows(row, 1, QtCore.QModelIndex())
                self.model.setData(
                    self.model.index(row, 0, QtCore.QModelIndex()),
                    self.attr_to_key[attr])
                self.model.setData(
                    self.model.index(row, 1, QtCore.QModelIndex()),
                    str(self.mode.data[attr].pop()))
                row += 1
        self.table.setModel(self.model)
        self.table.resizeColumnsToContents()
Exemplo n.º 12
0
class TodoListApp(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
        self.dbfilename = 'subjectDB.dat'
        self.subjectDB = []
        self.readSubjectDB()
        self.showSubjectDB()

    def initUI(self):
        # 추가, 완료, 수정 버튼
        addButton = QPushButton('추가', self)
        delButton = QPushButton('삭제', self)
        sortButton = QPushButton('정렬', self)

        addButton.clicked.connect(lambda: self.addButtonClicked())
        delButton.clicked.connect(lambda: self.delButtonClicked())
        sortButton.clicked.connect(lambda: self.sortButtonClicked())

        # 학번, 이름
        nameLabel = QLabel('202030xx 이OO', self)

        # 할 일 목록 만들기
        self.todoList = QTableView(self)
        self.todoList.setAlternatingRowColors(True)
        self.todoList.resize(400, 200)

        self.text = QStandardItemModel(0, 3, self)
        self.text.setHeaderData(0, Qt.Horizontal, "할 일")
        self.text.setHeaderData(1, Qt.Horizontal, "중요도")
        self.text.setHeaderData(2, Qt.Horizontal, "마감기한")

        self.todoList.setModel(self.text)
        self.todoList.setColumnWidth(0, 150)
        self.todoList.setColumnWidth(1, 80)

        # Layout 배치
        buttonBox = QHBoxLayout()
        buttonBox.addWidget(addButton)
        buttonBox.addWidget(delButton)
        buttonBox.addWidget(sortButton)
        buttonBox.addStretch(1)

        nameBox = QHBoxLayout()
        nameBox.addStretch(1)
        nameBox.addWidget(nameLabel)

        todoBox = QHBoxLayout()
        todoBox.addWidget(self.todoList)

        mainLayout = QVBoxLayout()
        mainLayout.addLayout(buttonBox)
        mainLayout.addStretch(1)
        mainLayout.addLayout(nameBox)
        mainLayout.addLayout(todoBox)

        self.setLayout(mainLayout)
        self.setGeometry(300, 300, 366, 300)
        self.setWindowTitle("To-do List")  # 타이틀 바꾸기

    def addButtonClicked(self):
        dlg = sInputDialog()
        dlg.exec_()
        if dlg.subjectName != "" and dlg.priority != None:
            try:
                record = {
                    'subjectName': dlg.subjectName,
                    'priority': dlg.priority,
                    'deadLine': dlg.deadLine
                }
                self.subjectDB += [record]
                self.showSubjectDB()
            except:
                pass
        return

    def delButtonClicked(self):
        text, ok = QInputDialog.getText(self, '삭제', '삭제할 과제명을 입력해 주세요:')

        if ok:
            t = text

            try:
                for task in self.subjectDB:
                    if t == task["subjectName"]:
                        self.subjectDB.remove(task)
                        break
            except IndexError as e:
                pass
        self.showSubjectDB()
        return

    def sortButtonClicked(self):
        self.subjectDB = subjectSort(self.subjectDB)
        self.subjectDB = sorted(self.subjectDB,
                                key=lambda person: person['orderScore'])
        self.showSubjectDB()
        return

    # DB에서 정보를 불러들이는 함수
    def readSubjectDB(self):
        try:
            fH = open(self.dbfilename)
        except FileNotFoundError as e:
            self.subjectDB = []
            return

        try:
            line = fH.read()
            self.subjectDB = eval(line)
        except:
            pass
        else:
            pass
        fH.close()

    # DB에서 불러온 정보를 화면에 표현하는 함수
    def showSubjectDB(self):
        # 테이블뷰 업데이트를 위해 이전테이블을 모두 지움
        self.text.removeRows(0, self.text.rowCount())

        # 테이블뷰에 subjectDB에 저장된 정보를 입력함
        row = 0
        for p in self.subjectDB:
            col = 0
            self.text.insertRows(self.text.rowCount(), 1)
            for attr in p:
                self.text.setData(self.text.index(row, col), str(p[attr]))
                col += 1
            row += 1

    def writeSubjectDB(self):
        fH = open(self.dbfilename, 'w')
        fH.write(str(self.subjectDB) + '\n')
        fH.close()

    def closeEvent(self, event):
        self.writeSubjectDB()
Exemplo n.º 13
0
class MainWindow(QMainWindow):
    def __init__(self, system):
        super(MainWindow, self).__init__()

        self.system = system
        fileMenu = QMenu("&Menu", self)
        dbinitAction = fileMenu.addAction("사용자 정보 초기화")
        quitAction = fileMenu.addAction("E&xit")
        quitAction.setShortcut("Ctrl+Q")

        self.menuBar().addMenu(fileMenu)
        self.statusBar()

        dbinitAction.triggered.connect(self.ClickAction_dbinit)
        quitAction.triggered.connect(QApplication.instance().quit)

        self.setupModel()
        self.setupViews()
        self.readDB()

        self.setWindowTitle("PyStudy 학습진도창")
        self.resize(870, 550)

    def setupModel(self):
        self.model = QStandardItemModel(3, 2, self)
        self.model.setHeaderData(0, Qt.Horizontal, "목록")
        self.model.setHeaderData(1, Qt.Horizontal, "읽기여부")
        self.model2 = QStandardItemModel(3, 2, self)
        self.model2.setHeaderData(0, Qt.Horizontal, "학습여부")
        self.model2.setHeaderData(1, Qt.Horizontal, "개수")

    def setupViews(self):
        splitter = QSplitter()
        self.table = QTableView()
        self.pieChart = PieView()

        splitter.addWidget(self.pieChart)
        splitter.addWidget(self.table)
        splitter.setStretchFactor(0, 0)
        splitter.setStretchFactor(1, 0)

        self.table.setModel(self.model)
        self.pieChart.setModel(self.model2)

        self.selectionModel = QItemSelectionModel(self.model2)
        self.table.setSelectionModel(self.selectionModel)

        #self.pieChart.setSelectionModel(self.selectionModel)

        #table.setColumnWidth(0,100)
        self.setCentralWidget(splitter)
        self.table.doubleClicked.connect(self.ClickAction_table)

    def readDB(self):

        con = sqlite3.connect("mystudy.db")
        cur = con.cursor()
        cur.execute("select subject, readcheck from study;")
        self.model.removeRows(0, self.model.rowCount(QModelIndex()),
                              QModelIndex())
        self.model2.removeRows(0, self.model2.rowCount(QModelIndex()),
                               QModelIndex())
        row = 0
        for line in cur:
            if line[1] == 1:
                result = "○"
            else:
                result = "X"
            self.model.insertRows(row, 1, QModelIndex())
            self.model.setData(self.model.index(row, 0, QModelIndex()),
                               line[0])
            self.model.setData(self.model.index(row, 1, QModelIndex()), result)
            self.model.setData(self.model.index(row, 1, QModelIndex()),
                               QVariant(Qt.AlignCenter), Qt.TextAlignmentRole)
            row += 1
        cur.execute("select count() from study ;")
        for line in cur:
            self.studyTotal = line[0]
        cur.execute("select count() from study where readcheck=1;")
        for line in cur:
            self.studyRead = line[0]
        #print("총 개수 " ,self.studyTotal ," 학습한개수", self.studyRead )
        con.close()
        row = 0
        self.model2.insertRows(row, 1, QModelIndex())
        self.model2.setData(self.model2.index(row, 0, QModelIndex()), "학습")
        self.model2.setData(self.model2.index(row, 1, QModelIndex()),
                            float(self.studyRead))
        self.model2.setData(self.model2.index(row, 0, QModelIndex()),
                            QColor("#99e600"), Qt.DecorationRole)
        row = 1
        self.model2.insertRows(row, 1, QModelIndex())
        self.model2.setData(self.model2.index(row, 0, QModelIndex()), "미학습")
        self.model2.setData(self.model2.index(row, 1, QModelIndex()),
                            float(self.studyTotal - self.studyRead))
        self.model2.setData(self.model2.index(row, 0, QModelIndex()),
                            QColor("#8080b3"), Qt.DecorationRole)

        self.table.setSelectionBehavior(QAbstractItemView.SelectRows)
        self.table.setSelectionMode(QAbstractItemView.SingleSelection)
        self.table.setDragEnabled(False)
        self.table.horizontalHeader().setStretchLastSection(True)
        self.table.setEditTriggers(QAbstractItemView.NoEditTriggers)
        self.table.resizeRowsToContents()
        self.table.resizeColumnsToContents()
        self.table.setColumnWidth(0, 350)
        #self.statusBar().showMessage("Loaded %s" % path, 2000)
    def ClickAction_table(self, index):
        #self.system
        #index.data()
        #self.table.selectedIndexes()[0].data()
        tempstr = self.table.selectedIndexes()[0].data().split()
        filepath = r"PyStudy_web\\example\\기본예제\\" + tempstr[0] + ".html"
        selectedRowKey = self.table.selectedIndexes()[0].row(
        ) + 1  #mysql 테이블 줄수 차이
        #print("click test ",selectedRowKey )
        con = sqlite3.connect("mystudy.db")
        cur = con.cursor()
        cur.execute("update 'study' set 'readcheck'=1 where key=" +
                    str(selectedRowKey) + ";")
        con.commit()
        con.close()
        self.setupViews()
        self.readDB()

        self.system.sendMessage("/학습창 열기 " + filepath)

    def ClickAction_dbinit(self, index):
        con = sqlite3.connect("mystudy.db")
        cur = con.cursor()
        cur.execute("update 'study' set 'readcheck'=0 ;")
        con.commit()
        con.close()
        self.setupViews()
        self.readDB()