發表文章

目前顯示的是有「PyQt5」標籤的文章

本站已搬家!

本站已搬家至https://blog.typeart.cc


歡迎舊雨新知指教!

PyQt5 QTableWidget 欄位值(cell)自動轉大寫

PyQt5 QTableWidget 欄位值(cell)自動轉大寫 稍微查一下PyQt5的語法,就會知道搭配Signal就可以讓cell被更動時觸發,並執行你要做的事 下列片段以本次主題:自動轉大寫為例 def __init__ ( self ) : #...省略其他片段 self . ui . tableWidget . itemChanged . connect ( self . upperText ) #...省略其他片段 def upperText ( self ) : item = self . ui . tableWidget . currentItem ( ) item . setText ( item . text ( ) . upper ( ) ) self . ui . tableWidget . setItem ( item . row ( ) , item . column ( ) , item ) 確實,這樣寫並沒有問題──只限於你的TABLE預設就有塞值在裡面 實務上,user倒入資料後(或是一啟動就直接連接資料庫取值),會發現程式直接崩潰 為什麼呢? 因為QTableWidget每次setItem時,都會觸發一次itemChanged! 而目前的table是空的,裡面沒有任何item,導致item.setText()這裡,找不到setText這個函數,於是程式就死掉了 解決方法就是 倒入資料到table時,暫停signal 在你放入資料的函數裡,頭尾分加入關閉、啟動signal就行了! def putIntoTable ( self ) : self . ui . tableWidget . blockSignals ( True ) for i in range ( 10 ) : self . ui . tableWidget . insertRow ( i ) self . ui . tableWidget . setItem ( i , 0 , QTableWidgetItem ( str ( i ) ) ) self . ui . tabl...

PyQt5 QTableWidget 多選刪除

PyQt5 QTableWidget 多選刪除 在QTableWidget中,呈現TABLE的方式是從1開始 但實際儲存方式,則是從0開始 也就是要刪除看到的第一列,參數要給0 self . ui . tableWidget . removeRow ( 0 ) #刪除看到的第一列 self . ui . tableWidget . removeRow ( 1 ) #刪除看到的第二列 self . ui . tableWidget . removeRow ( N -1 ) #刪除看到的第N列 但是要多選刪除時 就不是簡單的跑一個迴圈就行了 items = self . ui . tableWidget . selectedIndexes ( ) wannaDelRows = [ item . row ( ) for item in items ] for row in wannaDelRows : self . ui . tableWidget . removeRow ( row ) 實際運行會發現,只有第一列正確被刪除,其他列似乎全都不對了?! 錯誤的原因是因為第一列被刪除後,該列後方的所有位置也跟著減-1了! 也就是當你只是單純地使用selectedIndexes()取得多選的列來刪除的話,從第2筆開始的指到row,已經不在是當初user選到要刪除的row了! 那該怎麼解決呢? 很簡單,從後面開始刪除就行了! 為避免user選的item是同一個row不同column 造成同一個row取到2次,導致跑迴圈時刪除到不應該被刪掉的 因此還需要搭配set確保要刪除的row只會被執行一次 將原本的程式碼修改如下 items = self . ui . tableWidget . selectedIndexes ( ) wannaDelRows = [ item . row ( ) for item in items ] wannaDelRowsReverse = sorted ( set ( wannaDelRows ) , reverse = True ) for row in wannaDelRowsReverse : self . ui...

PyQt + pyinstaller,win工作列icon未正確顯示的問題

PyQt + pyinstaller,win工作列icon未正確顯示的問題 程式都完成了,最後為了一個小小的ICON,居然又折騰了一天… 在程式裡用 app.setWindowIcon(QIcon('icon.ico')) 開發環境下執行都正常,用pyinstaller打包後,ICON雖有顯示 但執行程式時,在WIN下的工作列卻是醜醜的程式框框圖 一搜尋馬上就發現也有人遇到一樣的問題: stack overflow/How to set application’s taskbar icon in Windows 7 但照著做,卻仍是沒icon。 查了許多篇似乎都指向pyinstaller的問題( github/Do not have a default-icon ) 但看文章時間都是4年前的時間了!一度跑去看pyinstaller的程式碼,感覺又像已修正過-.- 還試過直接去把pyinstaller的預設ico改成我自己的,再打包 仍是不行 最後,總算找到解決方法: 把icon打包至PyQt的qrc裡面,再從程式裡setWindowIcon 詳細作法: 新增一個icon.qrc的檔案,內容如下: <RCC> <qresource prefix="/" > <file>icon/anotherIcon.ico</file> //若是在其他目錄 <file>icon.ico</file> //若是跟程式同一層目錄 </qresource> </RCC> CD到專案目錄,執行: pyrcc5 -o iconQrc.py icon.qrc 到主程式修改你的setWindowIcon的ICON路徑,前面加冒號「:」 import iconQrc.py # your code app.setWindowIcon(QtGui.QIcon(':/icon.ico')) #若ICON在同一層目錄 app.setWindowIcon(QtGui.QIcon(':/icon/anotherIcon.ico')) #若ICON在子目錄 ...