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])
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()
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()
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()
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)
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()
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)
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()
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)
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()
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()
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()
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()