捷徑管理(pyqt5升級版) python pytq5

來源:互聯網
上載者:User

標籤:行選中   sys.argv   .data   資訊   trigger   where   visible   sele   ade   

之前用python寫了個小軟體http://blog.51cto.com/ikezcn/2142638
說實話用tk的話介面確實不好看,所以需要改進,看了pyqt5的介紹想要試一下,對於上次寫的軟體來說這裡只是更改了介面而已。上面的程式不再更新。

使用的軟體:
python3.6
pyqt5 安裝:pip insatll pyqt5

代碼(乾貨來了,之後會不定時更新):
2018-08-30更新

# -*- coding: utf-8 -*-#v2.0 2018-08-30更新import sys,osfrom PyQt5.QtCore import Qt,QVariantfrom PyQt5.QtSql import QSqlDatabase,QSqlTableModel,QSqlQueryfrom PyQt5.QtWidgets import QMainWindow,QMessageBox,QHeaderView,QAction, qApp, QApplication, QDesktopWidget , QGridLayout,QTableView,QAbstractItemViewfrom PyQt5.QtGui import QIconimport win32apiimport win32conclass Icon(QMainWindow):    def __init__(self,model,sqlite,query,view):        super().__init__()        self.model = model        self.sqlite = sqlite        self.query = query        self.view = view        self.setAcceptDrops(True)        self.statusBar().showMessage(‘Reday‘)        delAction = QAction("&刪除", self)        delAction.setShortcut("Ctrl+D")        delAction.setStatusTip("刪除選定的行")        delAction.triggered.connect(self.delrow)        deltableAction = QAction("&全部刪除", self)        deltableAction.setStatusTip("刪除所有的行")        deltableAction.triggered.connect(self.deltable)        vacuumAction = QAction("&整理資料庫", self)        vacuumAction.setShortcut("Ctrl+D")        vacuumAction.setStatusTip("讓資料庫變小")        vacuumAction.triggered.connect(self.vacuum)        menubar = self.menuBar()        menubar.addAction(delAction)        setMenu = menubar.addMenu(‘&設定‘)        setMenu.addAction(vacuumAction)        setMenu.addAction(deltableAction)        self.table1()        QMainWindow.setCentralWidget(self,self.view)        self.resize(800, 600)        self.center() #置中        self.setWindowTitle("HS捷徑")        #self.setWindowIcon(QIcon("icon.png"))        self.show()    def delrow(self):        if self.model.removeRow(self.view.currentIndex().row()):            if not self.model.submitAll():                QMessageBox.information(self,"刪除錯誤",self.model.lastError().text())    def deltable(self):        ret = QMessageBox.question(self,"提示!","是否刪除全部路徑",QMessageBox.Ok | QMessageBox.Cancel,QMessageBox.Cancel)        if 0x00000400 == ret: #OK            self.model.removeRows(0,self.model.rowCount())            self.model.submitAll()    def vacuum(self):        self.query.exec("VACUUM")    def center(self): #視窗置中        #QtGui.QDesktopWidget提供了關於使用者案頭的資訊,包括螢幕尺寸。        qr = self.frameGeometry()        cp = QDesktopWidget().availableGeometry().center()        qr.moveCenter(cp)        self.move(qr.topLeft())    def sql(self):        sqlite = QSqlDatabase.addDatabase("QSQLITE")        sqlite.setDatabaseName("db")        return sqlite    def table1(self):        try:            self.sqlite.open()        except (BaseException):            QMessageBox.information(self,"程式將關閉","資料庫開啟失敗")            sys.exit(app.exec_())        self.model.setTable("lj")        #self.model.setFilter("isdel = 0")        self.model.setSort(1,Qt.AscendingOrder) #按lj列排序        self.model.select()        self.model.setHeaderData(0, Qt.Horizontal, "ID")        self.model.setHeaderData(1, Qt.Horizontal,"路徑")        self.view.setModel(self.model)        self.view.setEditTriggers(QAbstractItemView.NoEditTriggers) #禁止對錶格編輯        self.view.horizontalHeader().setStretchLastSection(True) #是否填滿寬度        self.view.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)        self.view.hideColumn(0)#隱藏列        self.view.hideColumn(2)#隱藏列        self.view.setSelectionBehavior(QAbstractItemView.SelectRows) #點擊整行選中        self.view.setAlternatingRowColors(True) #隔行自動變色        self.view.verticalHeader().setVisible(False)#隱藏表頭        self.view.doubleClicked.connect(lambda:self.slotRowDoubleClicked())        #view.setAcceptDrops(True)        self.view.show()    def slotRowDoubleClicked(self):        try:            modedata = self.view.currentIndex().data()            data = str(modedata)            if os.path.exists(data):                win32api.ShellExecute(0,‘open‘,data,‘‘,‘‘,1)            else:                QMessageBox.information(self,"錯誤!","路徑不存在!")        except (BaseException):            QMessageBox.information(self,"錯誤!","開啟路徑存在錯誤!")            #print(sys.exc_info())        #QMessageBox.information(self,"index","index")    # def enableBorder(self, enable):    #     if enable:    #         self.setStyleSheet("MainWidget{border:3px solid #165E23}")    #     else:    #         self.setStyleSheet(‘‘)    def dragEnterEvent(self, event):        if event.mimeData().hasUrls():            event.acceptProposedAction()            #self.enableBorder(True)        else:            event.ignore()    def dragMoveEvent(self, event):        if event.mimeData().hasUrls():            event.setDropAction(Qt.LinkAction)            event.accept()        else:            event.ignore()    #def dragLeaveEvent(self, event):        #print(‘dragLeaveEvent...‘)        #self.enableBorder(False)    def dropEvent(self, event):        if event.mimeData().hasUrls():            counts = -1            record = self.model.record()            self.query.prepare("select count(*) as c from lj where lj=?") #不加 as c會報錯            # 遍曆輸出拖動進來的所有檔案路徑            for url in event.mimeData().urls():                string = url.toLocalFile().replace(‘/‘,‘\\‘)                self.query.bindValue(0,QVariant(string))                if self.query.exec():                    while query.next():                        counts = query.value(0)                if counts > 0:                    QMessageBox.information(self,"錯誤!","路徑已存在!")                elif counts  == 0:                    record.setValue(1,QVariant(url.toLocalFile().replace(‘/‘,‘\\‘))) #lj列                    record.setValue(2,QVariant(0)) #isdel列                    if self.model.insertRecord(-1,record):                        self.model.submitAll()                elif counts == -1:                    return            event.acceptProposedAction()            #self.enableBorder(False)        else:            event.ignore()    def closeEvent(self,event):        if self.sqlite.isOpen():            self.sqlite.close()if __name__ == "__main__":    #qss = QFile("stylesheet.qss") #樣式表    #qss.open(QIODevice.ReadOnly)  #樣式表    app = QApplication(sys.argv)    #app.setStyleSheet(str(qss.readAll(),encoding=‘utf-8‘)) #樣式表    #qss.close() #樣式表    sqlite = QSqlDatabase.addDatabase("QSQLITE")    sqlite.setDatabaseName("db")    model = QSqlTableModel(None,sqlite)    model.setEditStrategy(QSqlTableModel.OnManualSubmit)    query = QSqlQuery(sqlite)    view = QTableView()    icon = Icon(model,sqlite,query,view)    sys.exit(app.exec_())

樣式表:stylesheet.qss

QTableView {    color: black;                                       /*表格內文字顏色*/    gridline-color: white;                              /*表格內框顏色*/    background-color: rgb(250, 250, 115);    alternate-background-color: rgb(141, 163, 215);    selection-color: white;                             /*選中地區的文字顏色*/    selection-background-color: rgb(77, 77, 77);        /*選中地區的背景色*/    border: 2px groove gray;    border-radius: 0px;    padding: 2px 4px;}QHeaderView {color: black;font: bold 10pt;background-color: rgb(108, 108, 108);border: 0px solid rgb(144, 144, 144);border:0px solid rgb(191,191,191);border-left-color: rgba(255, 255, 255, 0);border-top-color: rgba(255, 255, 255, 0);border-radius:0px;min-height:29px;}QHeaderView.section {color: black;background-color: rgb(108, 108, 108);border: 5px solid #f6f7fa;border-radius:0px;border-color: rgb(64, 64, 64);}

資料庫 db

CREATE TABLE lj(id integer primary key,lj text not NULL,isdel BOOLEAN DEFAULT 0)

QT的樣式表使用起來確實很方便,但是覺的開啟軟體的時候會變慢所以在代碼裡注釋掉了

說說PYQT5與TK的使用感覺,TK上手方便,拿起來就能寫,PYQT5需要瞭解它的工作機制所以上手時間會比較長。比較喜歡qss、tableview、tablemodel,qss可以很方便的調整樣式而且和js很像,用過js的上手那叫一個快,tableview與tablemodel聯動可以少些很多代碼,最主要的它的容錯度很高,有些可以不用寫try也不會造成程式停止運行,這點很重要,哈哈,重要的點就在於‘懶’。

捷徑管理(pyqt5升級版) python pytq5

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.