qtextedit 默认文案_QT中常用的控件说明.md
2主窗口類型
有三種窗口
QMainWindow
QWiget
QDialog
QMainWindow:可以包含菜單欄,工具欄和標題欄,是
最常見的窗口顯示形式。
QDialog:是對話窗口的基類。沒有菜單欄,工具欄,狀態欄
QWiget:不確定窗口的用途,就用QWidget。
## QT中常用的控價
### 1、Qlabel控件
setAlignment() 設置文本的對齊方式
setIndent() 設置文本的縮進
text() 獲取文本
setBuddy() 設置伙伴關系
setText() 設置文本內容
selectedText() 返回所選擇的字符
setWordWrap() 設置是否運行換行
#### QLabel常用的信號
1.當鼠標劃過Qlabel控件時觸發:linkHovered
2.當鼠標單擊Qlabel控件時觸發:linkActivated
| 方法 | 解釋 |
| ------------- | ------------------------------- |
| clear() | 清空剪貼板內容 |
| mimeData() | 獲取剪貼板上的MIME類型數據 |
| setMimeData() | 將MIME類型數據放到剪貼板中 |
| pixmap() | 獲取剪貼板上的QPixmap類型的數據 |
| setPixmap() | 將QPixmap類型數據放到剪貼板中 |
| image() | 獲取剪貼板上QImage類型的數據 |
| setImage() | 將QImage類型數據放到剪貼板中 |
| text() | 獲取剪貼板上的文本 |
| setText() | 將文本放到剪貼板中 |
#### QLabel與伙伴控件
### 2、Edit控件
#### QLineEdit
基本功能:輸入單行的文本
##### EchoMode(回顯模式)
4種回顯模式
1、Normal
2、NoEcho
3、Password
4、PasswordEchoOnEdit
##### 方法:
+ setPlaceholderText():在line沒有輸入的時候給出提示信息
##### QLineEdit控件的輸入(校驗器)
如限制只能輸入整數,浮點數或者滿足一定條件的字符串
##### 用掩碼限制QLineEdit控件的輸入
```pyth
用掩碼限制QLineEdit控件的輸入
A ASCII字母字符是必須輸入的(A-Z、a-z)
a ASCII字母字符是允許輸入的,但不是必需的(A-Z、a-z)
N ASCII字母字符是必須輸入的(A-Z、a-z、0-9)
n ASII字母字符是允許輸入的,但不是必需的(A-Z、a-z、0-9)
X 任何字符都是必須輸入的
x 任何字符都是允許輸入的,但不是必需的
9 ASCII數字字符是必須輸入的(0-9)
0 ASCII數字字符是允許輸入的,但不是必需的(0-9)
D ASCII數字字符是必須輸入的(1-9)
d ASCII數字字符是允許輸入的,但不是必需的(1-9)
# ASCI數字字符或加減符號是允許輸入的,但不是必需的
H 十六進制格式字符是必須輸入的(A-F、a-f、0-9)
h 十六進制格式字符是允許輸入的,但不是必需的(A-F、a-f、0-9)
B 二進制格式字符是必須輸入的(0,1)
b 二進制格式字符是允許輸入的,但不是必需的(0,1)
> 所有的字母字符都大寫
< 所有的字母字符都小寫
! 關閉大小寫轉換
\ 使用"\"轉義上面列出的字符
```
##### QLineEdit綜合案例
#### QTextEdit控件
QLineEdit控件只支持單行輸入,QTextEdit支持多行輸入
##### 常用的方法:
1.setPlainText() #設置文本
2.setHtml() #設置html格式
3.toPlainText() #獲取文本
4.toHtml
5.setFont() 設置文本框顯示的字體,參數是Font類型
```python
#設置字體的多選框和設置字體的Line的
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QComboBox, QFontComboBox, QLineEdit, QMessageBox, QVBoxLayout
class Demo(QWidget):
def __init__(self):
super(Demo, self).__init__()
self.combobox_2 = QFontComboBox(self) # 2
self.lineedit = QLineEdit(self) # 3
self.v_layout = QVBoxLayout()
self.layout_init()
self.combobox_init()
def layout_init(self):
self.v_layout.addWidget(self.combobox_2)
self.v_layout.addWidget(self.lineedit)
self.setLayout(self.v_layout)
def combobox_init(self):
self.combobox_2.currentFontChanged.connect(lambda: self.on_combobox_func(self.combobox_2))
def on_combobox_func(self, combobox): # 8
self.lineedit.setFont(combobox.currentFont())
if __name__ == '__main__':
app = QApplication(sys.argv)
demo = Demo()
demo.show()
sys.exit(app.exec_())
```
##### 事件:
+ textChanged 當文本框的文本內容發生變化時自動觸發信號
#### QTextBrowser控件
QTextEdit和QTextBrowser控件類似,但是一般QTextEdit是用來編輯文本的,而QTextBroser是用來顯示文本的
### 4、按鍵控件
1.QPushButton
事件:
+ toggled 標記
配合isChecked()函數使用,如果按鍵是已經標記則打印True,否則打印False。
+ clicked 點擊
+ pressed 按下
+ released 松開
方法:
+ setCheckable(True) 設置一個按鍵為一個可以標記的按鍵,該按鍵就會有兩種狀態,標記和非標記的狀態
+ setIcon() 為按鍵設置一個圖片,傳入的參數是QIcon的格式
+ isChecked() 查看按鍵的狀態,如果是標記狀態則是True,否標記狀態False
```python
import sys
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton
class Demo(QWidget):
def __init__(self):
super(Demo, self).__init__()
self.test_button = QPushButton('Test', self)
self.test_button.setCheckable(True) #設置按鍵為一個可標記的按鍵
self.test_button.setIcon(QIcon('images/save_as.ico')) #為按鍵設置圖片
self.test_button.toggled.connect(self.button_state_func) #為按鍵綁定事件
def button_state_func(self):
print(self.test_button.isChecked()) # 4
if __name__ == '__main__':
app = QApplication(sys.argv)
demo = Demo()
demo.show()
sys.exit(app.exec_())
```
2.QToolButton
?注意:QToolButton實例化的時候不能直接傳入文本字符串,因為該控件沒有相應的初始化函數,也就是說這樣是錯誤的:self.test_button = QToolButton("test",self),如果要設置文本的話,的通過setText()的方法。但是如果同時使用setText()和setIcon()方法的話,只會顯示圖標。
```python
import sys
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QApplication, QWidget, QToolButton
class Demo(QWidget):
def __init__(self):
super(Demo, self).__init__()
self.test_button = QToolButton(self) # 1
self.test_button.setCheckable(True)
self.test_button.setIcon(QIcon('images/save_as.ico'))
self.test_button.toggled.connect(self.button_state_func)
self.test_button.isCheckable()
def button_state_func(self):
print(self.test_button.isChecked())
if __name__ == '__main__':
app = QApplication(sys.argv)
demo = Demo()
demo.show()
sys.exit(app.exec_())
```
3.QRadioButton
一個布局中只能又一個單選框被選中
方法toggled相當于選中和取消選中。現在QPushButton的toggle的方法類似,按下不會彈起
+ setChecked(True) 單選框設置為選中。
+ setChecke() 獲取是否選中的狀態
+ setCheckState() 傳入參數Qt.Checked為選中狀態,Qt.Unchecked為無選中的狀態,Qt.PartiallyChecked為半選中的狀態。
+ text() 獲取文本
+ stateChanged 在復選框的狀態發生改變的時候觸發
```python
import sys
from PyQt5.QtGui import QPixmap
from PyQt5.QtWidgets import QApplication, QWidget, QRadioButton, QLabel, QHBoxLayout, QVBoxLayout
class Demo(QWidget):
def __init__(self):
super(Demo, self).__init__()
self.off_button = QRadioButton('off', self) # 1
self.on_button = QRadioButton('on', self) # 2
self.pic_label = QLabel(self) # 3
self.button_h_layout = QHBoxLayout()
self.pic_h_layout = QHBoxLayout()
self.all_v_layout = QVBoxLayout()
self.layout_init()
self.radiobutton_init()
self.label_init()
def layout_init(self):
self.pic_h_layout.addStretch(1) #在未加入標簽之前先加入一個占位符
self.pic_h_layout.addWidget(self.pic_label)
self.pic_h_layout.addStretch(1) #在加入標簽之后加入一個占位符,作用是拉伸窗口的時候,label會自動適用窗口的大小
self.button_h_layout.addWidget(self.off_button)
self.button_h_layout.addWidget(self.on_button)
self.all_v_layout.addLayout(self.pic_h_layout)
self.all_v_layout.addLayout(self.button_h_layout)
self.setLayout(self.all_v_layout)
def radiobutton_init(self):
self.off_button.setChecked(True) #設置為選中的狀態
self.off_button.toggled.connect(self.on_off_bulb_func) # 6
# self.on_button.toggled.connect(self.on_off_bulb_func)
def label_init(self):
self.pic_label.setPixmap(QPixmap('images/off.png')) # 7
def on_off_bulb_func(self): # 8
if self.off_button.isChecked():
self.pic_label.setPixmap(QPixmap('images/off.png'))
else:
self.pic_label.setPixmap(QPixmap('images/on.png'))
if __name__ == '__main__':
app = QApplication(sys.argv)
demo = Demo()
demo.show()
sys.exit(app.exec_())
```
4.QCheckBox
三種狀態:
1、沒選中0
2、半選中1
3、選中2
復選框一共有三種狀態:全選中、半選中和無選中。若一個父選項的子選項全部為選中狀態,則該父選項為全選中;若子選項全部為無選中狀態,則該父選項為無選中狀態;若子選項既有全選中和無選中狀態,則該父選項為半選中狀態。
事件:
?stateChanged 是狀態變化時觸發信號
方法:
?checkState() 查看選中的狀態:0、1、2
?setchecked(True) 設置選擇狀態,只有選中和未選中
?setcheckState() 設置選擇的狀態,Qt.Checked為選中的狀態,Qt.Unchecked未選中狀態和
?Qt.PartiallyChecked為半選中的狀態。
```py
import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QWidget, QCheckBox, QVBoxLayout
class Demo(QWidget):
def __init__(self):
super(Demo, self).__init__()
self.checkbox1 = QCheckBox('Checkbox 1', self)
self.checkbox2 = QCheckBox('Checkbox 2', self)
self.checkbox3 = QCheckBox('Checkbox 3', self)
self.v_layout = QVBoxLayout()
self.checkbox_init()
self.layout_init()
def layout_init(self):
self.v_layout.addWidget(self.checkbox1)
self.v_layout.addWidget(self.checkbox2)
self.v_layout.addWidget(self.checkbox3)
self.setLayout(self.v_layout)
def checkbox_init(self):
# self.checkbox1.setChecked(True) # 1
self.checkbox1.setCheckState(Qt.Checked) # 2
self.checkbox1.stateChanged.connect(lambda: self.on_state_change_func(self.checkbox1)) # 3
# self.checkbox2.setChecked(False)
self.checkbox2.setCheckState(Qt.Unchecked)
self.checkbox2.stateChanged.connect(lambda: self.on_state_change_func(self.checkbox2))
# self.checkbox3.setTristate(True) # 4
self.checkbox3.setCheckState(Qt.PartiallyChecked) # 5
self.checkbox3.stateChanged.connect(lambda: self.on_state_change_func(self.checkbox3))
def on_state_change_func(self, checkbox): # 6
print('{} was clicked, and its current state is {}'.format(checkbox.text(), checkbox.checkState()))
if __name__ == '__main__':
app = QApplication(sys.argv)
demo = Demo()
demo.show()
sys.exit(app.exec_())
```
父類都是QAbstractButton
### 5、下拉列表控件QComboBox
```python
from PyQt5.QtWidgets import QCombobox
choice = "a"
choice_list = ["a","b","c"]
self.combobox_1 = QCombobox(self)
self.combobox_1.addItem(choice) #選擇下拉框中的一項
self.combobox_1.addItems(choice_list) #選擇下拉框的下拉列表
```
+ currentIndexChanged 當下拉框的選項發生變化時,會觸發這個方法。
+ currentTextChanged 當下拉框的文本發生變化時,會觸發這個方法。
+ currentIndex() 獲取下拉框當前的序號
+ currentText() 獲取當前的文本值
```python
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QComboBox, QFontComboBox, QLineEdit, QMessageBox, QVBoxLayout
class Demo(QWidget):
choice = 'a'
choice_list = ['b', 'c', 'd', 'e']
def __init__(self):
super(Demo, self).__init__()
self.combobox_1 = QComboBox(self) # 1
self.combobox_2 = QFontComboBox(self) # 2
self.lineedit = QLineEdit(self) # 3
self.v_layout = QVBoxLayout()
self.layout_init()
self.combobox_init()
def layout_init(self):
self.v_layout.addWidget(self.combobox_1)
self.v_layout.addWidget(self.combobox_2)
self.v_layout.addWidget(self.lineedit)
self.setLayout(self.v_layout)
def combobox_init(self):
self.combobox_1.addItem(self.choice) # 4
self.combobox_1.addItems(self.choice_list) # 5
self.combobox_1.currentIndexChanged.connect(lambda: self.on_combobox_func(self.combobox_1)) # 6
# self.combobox_1.currentTextChanged.connect(lambda: self.on_combobox_func(self.combobox_1)) # 7
self.combobox_2.currentFontChanged.connect(lambda: self.on_combobox_func(self.combobox_2))
# self.combobox_2.currentFontChanged.connect(lambda: self.on_combobox_func(self.combobox_2))
def on_combobox_func(self, combobox): # 8
if combobox == self.combobox_1:
QMessageBox.information(self, 'ComboBox 1',
'{}: {}'.format(combobox.currentIndex(), combobox.currentText()))
else:
self.lineedit.setFont(combobox.currentFont())
if __name__ == '__main__':
app = QApplication(sys.argv)
demo = Demo()
demo.show()
sys.exit(app.exec_())
```
### 6、滑塊控件
#### QSlider
```python
#水平滑條
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QSlider
self.slider_1 = QSlider(Qt.Horizontal,self)
self.slider_1.setRanger(0,100)
#垂直滑塊
self.slider_2 = QSlider(Qt.Vertical,self)
self.slider_2.setMinmum(0)
self.slider_2.setMaxmum(100)
```
valueChanged 滑塊的值發生變化的時候觸發此方法
```python
import sys
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QFont
from PyQt5.QtWidgets import QApplication, QWidget, QSlider, QLabel, QVBoxLayout, QHBoxLayout
class Demo(QWidget):
def __init__(self):
super(Demo, self).__init__()
self.slider_1 = QSlider(Qt.Horizontal) # 水平滑塊
self.slider_1.setRange(0, 100) #設置滑塊滑動的范圍
self.slider_1.valueChanged.connect(lambda: self.on_change_func(self.slider_1)) # 3
self.slider_2 = QSlider(Qt.Vertical) #豎直的滑塊
self.slider_2.setMinimum(0) # 4
self.slider_2.setMaximum(100) # 5
self.slider_2.valueChanged.connect(lambda: self.on_change_func(self.slider_2))
self.label = QLabel('0', self) # 6
self.label.setFont(QFont('Arial Black', 20))
self.h_layout = QHBoxLayout()
self.v_layout = QVBoxLayout()
self.h_layout.addWidget(self.slider_2)
self.h_layout.addStretch(1)
self.h_layout.addWidget(self.label)
self.h_layout.addStretch(1)
self.v_layout.addWidget(self.slider_1)
self.v_layout.addLayout(self.h_layout)
self.setLayout(self.v_layout)
def on_change_func(self, slider): # 7
if slider == self.slider_1:
self.slider_2.setValue(self.slider_1.value())
self.label.setText(str(self.slider_1.value()))
else:
self.slider_1.setValue(self.slider_2.value())
self.label.setText(str(self.slider_2.value()))
if __name__ == '__main__':
app = QApplication(sys.argv)
demo = Demo()
demo.show()
sys.exit(app.exec_())
```
#### QDial
```python
#球形滑塊
from PyQt5.QtWidgets import QDial
self.dial = QDial(self)
self.dial.setFixedSize(100,100) #設置QDail的大小
self.dial.setRange(0,100) #滑動的范圍
self.dial.setNotchesVisible(True) #顯示刻度,根據我們設置的數值自動調整
```
+ valueChanged 當改變Qdial的值時自動觸發這個信號
```python
import sys
from PyQt5.QtGui import QFont
from PyQt5.QtWidgets import QApplication, QWidget, QDial, QLabel, QHBoxLayout
class Demo(QWidget):
def __init__(self):
super(Demo, self).__init__()
self.setWindowTitle('QDial') # 1
self.dial = QDial(self)
self.dial.setFixedSize(100, 100) # 2
self.dial.setRange(0, 100) # 3
self.dial.setNotchesVisible(True) # 4
self.dial.valueChanged.connect(self.on_change_func) # 5
self.label = QLabel('0', self)
self.label.setFont(QFont('Arial Black', 20))
self.h_layout = QHBoxLayout()
self.h_layout.addWidget(self.dial)
self.h_layout.addWidget(self.label)
self.setLayout(self.h_layout)
def on_change_func(self):
self.label.setText(str(self.dial.value()))
if __name__ == '__main__':
app = QApplication(sys.argv)
demo = Demo()
demo.show()
sys.exit(app.exec_())
```
### 7、計數器控件 QSpinBox
```python
from PyQt5.Qtwidgets import QSpinBox
self.spinbox = QSpinbox(self)
self.spinbox.setRange(-99,99)
self.spinbox.setSigleStep(1)
self.spinbox.setValue(66)
```
+ valueChanged 當里面的值發生變化時觸發此信號
+ setValue() 設置計數器的值。
+ value() 獲取計數器的值
QSpinBox為整型的數字計數器,而QDoubleSpinBox為浮點型的數字計數器
```python
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QSpinBox, QDoubleSpinBox, QHBoxLayout
class Demo(QWidget):
def __init__(self):
super(Demo, self).__init__()
self.spinbox = QSpinBox(self)
self.spinbox.setRange(-99, 99) # 1
self.spinbox.setSingleStep(1) # 2
self.spinbox.setValue(66) # 3
self.spinbox.valueChanged.connect(self.value_change_func) # 4
self.double_spinbox = QDoubleSpinBox(self) # 5
self.double_spinbox.setRange(-99.99, 99.99)
self.double_spinbox.setSingleStep(0.01)
self.double_spinbox.setValue(66.66)
self.h_layout = QHBoxLayout()
self.h_layout.addWidget(self.spinbox)
self.h_layout.addWidget(self.double_spinbox)
self.setLayout(self.h_layout)
def value_change_func(self):
decimal_part = self.double_spinbox.value() - int(self.double_spinbox.value()) # 6
self.double_spinbox.setValue(self.spinbox.value() + decimal_part) # 7
if __name__ == '__main__':
app = QApplication(sys.argv)
demo = Demo()
demo.show()
sys.exit(app.exec_())
```
### 8 定時器和進度條
QTimer
```python
self.timer = QTimer(self)
self.timer.start(100) #開始啟動,沒過100ms觸發timeout信號
self.tiomer.stop() #停止
```
+ isActive() 為True時表示計時器已啟動,False為計時器沒有啟動
+ timeout 超時信號器,當有超時信號來時自動觸發
```python
import sys
from PyQt5.QtCore import QTimer, Qt
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QLabel, QVBoxLayout
class Demo(QWidget):
def __init__(self):
super(Demo, self).__init__()
self.label = QLabel('0', self) # 1
self.label.setAlignment(Qt.AlignCenter)
self.step = 0 # 2
self.timer = QTimer(self) # 3
self.timer.timeout.connect(self.update_func) #到達計時時長之后自動觸發
self.ss_button = QPushButton('Start', self) # 4
self.ss_button.clicked.connect(self.start_stop_func)
self.v_layout = QVBoxLayout()
self.v_layout.addWidget(self.label)
self.v_layout.addWidget(self.ss_button)
self.setLayout(self.v_layout)
def start_stop_func(self):
if not self.timer.isActive():
self.ss_button.setText('Stop')
self.timer.start(1000) #開始計時,并設置計時的時長,每次到達后,自動重新計時
else:
self.ss_button.setText('Start')
self.timer.stop()
def update_func(self):
self.step += 1
self.label.setText(str(self.step))
if __name__ == '__main__':
app = QApplication(sys.argv)
demo = Demo()
demo.show()
sys.exit(app.exec_())
```
QProgressBar
```python
from PyQt5.QtWidgets importy QProcessBar
self.progressbar = QProgressBar(self)
self.progressbar.setMinimum(0)
self.progressbar.setMaximum(100)
```
+ setQrientation(Qt.Vertical) 設置進度條是垂直顯示的,進度條默認是水平的
+ reset() 重置進度條
```python
import sys
from PyQt5.QtCore import Qt, QTimer
from PyQt5.QtWidgets import QApplication, QWidget, QProgressBar, QPushButton, QHBoxLayout, QVBoxLayout
class Demo(QWidget):
def __init__(self):
super(Demo, self).__init__()
self.progressbar = QProgressBar(self) # 1
# self.progressbar.setOrientation(Qt.Vertical)
self.progressbar.setMinimum(0) # 2
self.progressbar.setMaximum(100)
# self.progressbar.setRange(0, 100)
self.step = 0 # 3
self.timer = QTimer(self) # 4
self.timer.timeout.connect(self.update_func)
self.ss_button = QPushButton('Start', self) # 5
self.ss_button.clicked.connect(self.start_stop_func)
self.reset_button = QPushButton('Reset', self) # 6
self.reset_button.clicked.connect(self.reset_func)
self.h_layout = QHBoxLayout()
self.v_layout = QVBoxLayout()
self.h_layout.addWidget(self.ss_button)
self.h_layout.addWidget(self.reset_button)
self.v_layout.addWidget(self.progressbar)
self.v_layout.addLayout(self.h_layout)
self.setLayout(self.v_layout)
def start_stop_func(self):
if self.ss_button.text() == 'Start':
self.ss_button.setText('Stop')
self.timer.start(100)
else:
self.ss_button.setText('Start')
self.timer.stop()
def update_func(self):
self.step += 1
self.progressbar.setValue(self.step)
if self.step >= 100:
self.ss_button.setText('Start')
self.timer.stop()
self.step = 0
def reset_func(self):
self.progressbar.reset()
self.ss_button.setText('Start')
self.timer.stop()
self.step = 0
if __name__ == '__main__':
app = QApplication(sys.argv)
demo = Demo()
demo.show()
sys.exit(app.exec_())
```
### 9 液晶數字顯示屏QLCDNumber
```python
from PyQt5.QtWidgets import QLCDNumber
self.lcd_1 = QLCDNumber(self)
self.lcd_1.setDigitCount(10) #顯示多少數字
self.lcd_1.display(1234567890)
```
+ setSegmentStyle()可以設置顯示屏數字樣式
| 常量 | 值 | 描述 |
| ------------------ | ---- | ---------------------------------------- |
| QLCDNumber.Outline | 0 | 讓內容浮顯,其顏色同顯示屏背景顏色相同 |
| QLCDNumber.Filled | 1 | 讓內容浮顯,顏色同窗口標題顏色相同 |
| QLCDNumber.Flat | 2 | 讓內容扁平化顯示,顏色同窗口標題顏色相同 |
+ setSmallDecimalPoint(bool)方法key9i設置小數點的顯示方式:為True小數點就在兩個數字之間顯示出來,而不會單獨占一個位置,如果為False,那么就會單獨占位(默認為False)
+ setMode()方法來更改數字顯示方式
| 參數 | 值 | 描述 |
| -------------- | ---- | -------- |
| QLCDNumber.Hex | 0 | 十六進制 |
| QLCDNumber.Dec | 1 | 十進制 |
| QLCDNumber.Oct | 2 | 八進制 |
| QLCDNumber.Bin | 3 | 二進制 |
### 10 日期相關的控件
QCalendarWidget 日歷控件
```python
from PyQt5.QtWidgets import QCalendarWidget
self.calendar = QCalendarWidget(self)
self.calendar.setMinimumDate(QDate(1956,2,14))
self.calendar.setMaximumDate(QDate(6666,6,6))
self.calendat.setGridVisible(True) #是否顯示網格
self.calendat.setSelectedDate(QDate(2020,8,9))
self.calendar.setFirstDayOfWeek(Qt.Monday) #設置一周的第一天是星期幾
```
+ setFirstDayOfWeek() 設置一個星期的第一天,默認是星期天
| Qt.Monday | 星期一 |
| ------------ | ------ |
| Qt.Tuesday | 星期二 |
| Qt.Wednesday | 星期三 |
| Qt.Thursday | 星期四 |
| Qt.Friday | 星期五 |
| Qt.Saturday | 星期六 |
| Qt.Sunday | 星期天 |
+ selectedDate().toString('ddd') 方法獲取星期的縮寫
#### QDateTimeEdit
```python
from PyQt5.QtWidgets import QDateTimeEdit,QDateEdit,QTimeEdit
from PyQt5.QtCore import QDate,QTime,QDateTime
self.datetime_1 = QDateTimeEdit(self) #初始時間2000年1月1號
self.datetime_2 = QDateTimeEdit(QDateTime.currentDateTime(),self) #系統的當前時間
self.datetime_2.setDisplayFormat("yyyy-MM-dd HH:mm:ss") #顯示的格式 'yyyy/MM/dd','HH:mm:ss'
print(self.datetime_2.date()) #日期
print(self.datetime_2.time())#時間
print(self.datetime_2.dateTime()) #日期+時間
self.datetime_2.setCalendarPopup(True) #改變日期的時候調用日歷
```
+ dateChanged 當時間改變的時候觸發此信號
```python
import sys
from PyQt5.QtCore import QDate, QTime, QDateTime
from PyQt5.QtWidgets import QApplication, QWidget, QDateTimeEdit, QDateEdit, QTimeEdit, QVBoxLayout
class Demo(QWidget):
def __init__(self):
super(Demo, self).__init__()
self.datetime_1 = QDateTimeEdit(self) # 1
self.datetime_1.dateChanged.connect(lambda: print('Date Changed!'))
self.datetime_2 = QDateTimeEdit(QDateTime.currentDateTime(), self) # 2
self.datetime_2.setDisplayFormat('yyyy-MM-dd HH:mm:ss')
self.datetime_2.timeChanged.connect(lambda: print('Time Changed!'))
print(self.datetime_2.date())
print(self.datetime_2.time())
print(self.datetime_2.dateTime())
self.datetime_3 = QDateTimeEdit(QDateTime.currentDateTime(), self) # 3
self.datetime_3.dateTimeChanged.connect(lambda: print('DateTime Changed!'))
self.datetime_3.setCalendarPopup(True)
self.datetime_4 = QDateTimeEdit(QDate.currentDate(), self) # 4
self.datetime_5 = QDateTimeEdit(QTime.currentTime(), self)
self.date = QDateEdit(QDate.currentDate(), self) # 5
self.date.setDisplayFormat('yyyy/MM/dd')
print(self.date.date())
self.time = QTimeEdit(QTime.currentTime(), self) # 6
self.time.setDisplayFormat('HH:mm:ss')
print(self.time.time())
self.v_layout = QVBoxLayout()
self.v_layout.addWidget(self.datetime_1)
self.v_layout.addWidget(self.datetime_2)
self.v_layout.addWidget(self.datetime_3)
self.v_layout.addWidget(self.datetime_4)
self.v_layout.addWidget(self.datetime_5)
self.v_layout.addWidget(self.date)
self.v_layout.addWidget(self.time)
self.setLayout(self.v_layout)
if __name__ == '__main__':
app = QApplication(sys.argv)
demo = Demo()
demo.show()
sys.exit(app.exec_())
```
### 11、各種對話框
QDialog是所有對話框的基類
下面四種為常見的對話框
QMessageBox 消息對話框
QColorDialog 顏色對話框
QFontDialog 字體對話框
QInPutDialog 輸入對話框
QFileDialog 文件對話框
#### 消息對話框QmessageBox
總共分為以下幾種
1、關于對話框
```python
QMessageBox.about(self, 'Title', "content")
```
2、錯誤對話框
```python
QMessageBox.critical(self, 'Title', "content")
```
3、警告對話框
```python
QMessageBox.warning(self, 'Title', "content")
```
4、提問對話
```python
QMessageBox.question(self, 'Title', 'Content')
```
5、消息對話框
```python
from PyQt5.QtWidgets import QMessageBox
QMessageBox.information(self, 'Title', "content", QMessageBox.Yes | QMessageBox.No
| QMessageBox.Cancel)
```
```python
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QMessageBox
class Demo(QWidget):
def __init__(self):
super(Demo, self).__init__()
self.button = QPushButton('information', self)
self.button.clicked.connect(self.show_messagebox)
def show_messagebox(self):
#第一個參數填self表示這個消息對話框是屬于Demo窗口的
QMessageBox.information(self, 'Title', 'Content',
QMessageBox.Yes | QMessageBox.No | QMessageBox.Cancel)
if __name__ == '__main__':
app = QApplication(sys.argv)
demo = Demo()
demo.show()
sys.exit(app.exec_())
```
常見的按鈕類型有以下幾種:
+ QMessageBox.OK
+ QMessageBox.Yes
+ QMessageBox.No
+ QMessageBox.Close
+ QMessageBox.Cancel
+ QMessageBox.Open
+ QMessageBox.Save
有2點差異
1、顯示的對話框圖標可能不同
2、顯示的按鈕是不一樣的
```python
#與消息框進行交互
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QMessageBox
class Demo(QWidget):
def __init__(self):
super(Demo, self).__init__()
self.button = QPushButton('Click Me!', self)
self.button.clicked.connect(self.show_messagebox)
def show_messagebox(self):
choice = QMessageBox.question(self, 'Change Text?', 'Would you like to change the button text?',
QMessageBox.Yes | QMessageBox.No)
#選擇不同的按鈕,有不同選擇
if choice == QMessageBox.Yes:
self.button.setText('Changed!')
elif choice == QMessageBox.No:
pass
if __name__ == '__main__':
app = QApplication(sys.argv)
demo = Demo()
demo.show()
sys.exit(app.exec_())
```
```python
#調用父類QDialog來使用消息框
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QDialog, QLineEdit, QPushButton
class Demo(QWidget):
def __init__(self):
super(Demo, self).__init__()
self.resize(300, 100)
self.dialog = SigninPage()
self.btn = QPushButton("調用Dialog", self)
self.btn.clicked.connect(self.my_dialog)
def my_dialog(self):
self.dialog.exec_() #使用exec_()方法可以在主程序中加載一個dialog出來
class SigninPage(QDialog):
def __init__(self):
super(SigninPage, self).__init__()
self.resize(200, 100)
self.line = QLineEdit("我是一個新的dialog", self)
if __name__ == '__main__':
app = QApplication(sys.argv)
demo = Demo()
demo.show()
sys.exit(app.exec_())
```
#### 顏色對話框和字體對話框
```python
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QTextEdit, QColorDialog, QFontDialog, QPushButton,QHBoxLayout, QVBoxLayout
class Demo(QWidget):
def __init__(self):
super(Demo, self).__init__()
self.text_edit = QTextEdit(self)
self.color_btn = QPushButton('Color', self)
self.font_btn = QPushButton('Font', self)
self.color_btn.clicked.connect(lambda: self.open_dialog_func(self.color_btn))
self.font_btn.clicked.connect(lambda: self.open_dialog_func(self.font_btn))
self.h_layout = QHBoxLayout()
self.h_layout.addWidget(self.color_btn)
self.h_layout.addWidget(self.font_btn)
self.v_layout = QVBoxLayout()
self.v_layout.addWidget(self.text_edit)
self.v_layout.addLayout(self.h_layout)
self.setLayout(self.v_layout)
def open_dialog_func(self, btn):
if btn == self.color_btn:
color = QColorDialog.getColor() #獲取顏色框
if color.isValid():
self.text_edit.setTextColor(color) #設置顏色
else:
font, ok = QFontDialog.getFont() #獲取字體的框
if ok:
self.text_edit.setFont(font) #設置字體
if __name__ == '__main__':
app = QApplication(sys.argv)
demo = Demo()
demo.show()
sys.exit(app.exec_())
```
#### 輸入對話框
輸入對話框一共有五種輸入的方法:
| 方法 | 用法 |
| ------------------ | ---------------------- |
| getItem() | 從下拉框中獲取選項輸入 |
| getInt() | 獲取整型值輸入 |
| getDouble() | 獲取浮點型值輸入 |
| getText() | 獲取字符輸入 |
| getMultiLineText() | 獲取多行字符串輸入 |
```python
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QInputDialog, QLineEdit, QTextEdit, QPushButton,QGridLayout
class Demo(QWidget):
def __init__(self):
super(Demo, self).__init__()
self.name_btn = QPushButton('Name', self)
self.gender_btn = QPushButton('Gender', self)
self.age_btn = QPushButton('Age', self)
self.score_btn = QPushButton('Score', self)
self.info_btn = QPushButton('Info', self)
self.name_btn.clicked.connect(lambda: self.open_dialog_func(self.name_btn))
self.gender_btn.clicked.connect(lambda: self.open_dialog_func(self.gender_btn))
self.age_btn.clicked.connect(lambda: self.open_dialog_func(self.age_btn))
self.score_btn.clicked.connect(lambda: self.open_dialog_func(self.score_btn))
self.info_btn.clicked.connect(lambda: self.open_dialog_func(self.info_btn))
self.name_line = QLineEdit(self)
self.gender_line = QLineEdit(self)
self.age_line = QLineEdit(self)
self.score_line = QLineEdit(self)
self.info_textedit = QTextEdit(self)
self.g_layout = QGridLayout()
self.g_layout.addWidget(self.name_btn, 0, 0, 1, 1)
self.g_layout.addWidget(self.name_line, 0, 1, 1, 1)
self.g_layout.addWidget(self.gender_btn, 1, 0, 1, 1)
self.g_layout.addWidget(self.gender_line,1, 1, 1, 1)
self.g_layout.addWidget(self.age_btn, 2, 0, 1, 1)
self.g_layout.addWidget(self.age_line, 2, 1, 1, 1)
self.g_layout.addWidget(self.score_btn, 3, 0, 1, 1)
self.g_layout.addWidget(self.score_line, 3, 1, 1, 1)
self.g_layout.addWidget(self.info_btn, 4, 0, 1, 1)
self.g_layout.addWidget(self.info_textedit, 4, 1, 1, 1)
self.setLayout(self.g_layout)
def open_dialog_func(self, btn):
if btn == self.name_btn: #QInputDialog為輸入對話框
name, ok = QInputDialog.getText(self, 'Name Input', 'Please enter the name:')
if ok:
self.name_line.setText(name)
elif btn == self.gender_btn:
gender_list = ['Female', 'Male']
gender, ok = QInputDialog.getItem(self, 'Gender Input', 'Please choose the gender:', gender_list, 0, False)
if ok:
self.gender_line.setText(gender)
elif btn == self.age_btn:
age, ok = QInputDialog.getInt(self, 'Age Input', 'Please select the age:')
if ok:
self.age_line.setText(str(age))
elif btn == self.score_btn:
score, ok = QInputDialog.getDouble(self, 'Score Input', 'Please select the score:')
if ok:
self.score_line.setText(str(score))
else:
info, ok = QInputDialog.getMultiLineText(self, 'Info Input', 'Please enter the info:')
if ok:
self.info_textedit.setText(info)
if __name__ == '__main__':
app = QApplication(sys.argv)
demo = Demo()
demo.show()
sys.exit(app.exec_())
```
#### 文件對話框
```python
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QTextEdit, QPushButton, QMessageBox, QVBoxLayout,QHBoxLayout, QFileDialog
class Demo(QWidget):
def __init__(self):
super(Demo, self).__init__()
self.is_saved = True
self.is_saved_first = True
self.path = ''
self.textedit = QTextEdit(self)
self.textedit.textChanged.connect(self.on_textchanged_func) #文本內容改變時自動觸發
self.button = QPushButton('Save', self)
self.button.clicked.connect(self.on_clicked_func)
self.button_2 = QPushButton('Open', self)
self.button_2.clicked.connect(self.open_file_func)
self.h_layout = QHBoxLayout()
self.h_layout.addWidget(self.button)
self.h_layout.addWidget(self.button_2)
self.v_layout = QVBoxLayout()
self.v_layout.addWidget(self.textedit)
self.v_layout.addLayout(self.h_layout)
self.setLayout(self.v_layout)
def on_textchanged_func(self):
if self.textedit.toPlainText():
self.is_saved = False
else:
self.is_saved = True
def on_clicked_func(self):
if self.is_saved_first:
self.save_as_func(self.textedit.toPlainText())
else:
self.save_func(self.textedit.toPlainText())
def save_func(self, text):
with open(self.path, 'w') as f:
f.write(text)
self.is_saved = True
def save_as_func(self, text):
#保存文件的對話框
self.path, _ = QFileDialog.getSaveFileName(self, 'Save File', './', 'Files (*.txt *.log)')
if self.path:
with open(self.path, 'w') as f:
f.write(text)
self.is_saved = True
self.is_saved_first = False
def open_file_func(self):
#打開文本對話框
file, _ = QFileDialog.getOpenFileName(self, 'Open File', './', 'Files (*.txt *.log)')
if file:
with open(file, 'r') as f:
self.textedit.clear()
self.textedit.setText(f.read())
self.is_saved = True
#關閉程序事件
def closeEvent(self, QCloseEvent):
if not self.is_saved:
choice = QMessageBox.question(self, '', 'Do you want to save the text?',
QMessageBox.Yes | QMessageBox.No | QMessageBox.Cancel)
if choice == QMessageBox.Yes:
self.on_clicked_func()
QCloseEvent.accept()
elif choice == QMessageBox.No:
QCloseEvent.accept()
else:
QCloseEvent.ignore()
if __name__ == '__main__':
app = QApplication(sys.argv)
demo = Demo()
demo.show()
sys.exit(app.exec_())
```
### 12、繪圖API:繪制文本 QPainter
drawText()
1.文本
2、各種圖形(直線、點、橢圓、弧、扇形、多變形等)
3、圖形
painter = QPainter()
painter.begin()
painter.drawText()
painter.end()
必須在pantEvent事件中繪制各種元素
#### 用像素繪制正弦曲線QPainter
drawPoint(x,y)
#### 繪制不同的直線QPainter
drawLine()
#### 繪制不同的圖像
rect = QRect(0,10,100,100)
aln:1一個alen等于1/16度
drawArc(rect ,0, 45*16)
#### 繪制帶鉉的弧
drawpie(10,240,100,100,12,130*16)
橢圓
drawEllipse(120,120,150,100)
### 13 組合框QGroupBox和工具箱QToolBox
#### QGroupBox
容器,可以把相同功能的控件放在一起,使得界面更加清晰
```python
import sys
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPixmap
from PyQt5.QtWidgets import QApplication, QWidget, QGroupBox, QRadioButton, QLabel, QHBoxLayout, QVBoxLayout
class Demo(QWidget):
def __init__(self):
super(Demo, self).__init__()
self.groupbox_1 = QGroupBox('On and Off', self) # 1
self.groupbox_2 = QGroupBox('Change Color', self)
self.red = QRadioButton('Red', self) # 2
self.blue = QRadioButton('Blue', self)
self.green = QRadioButton('Green', self)
self.yellow = QRadioButton('Yellow', self)
self.color_list = [self.red, self.blue, self.green, self.yellow]
self.on = QRadioButton('On', self) # 3
self.off = QRadioButton('Off', self)
self.pic_label = QLabel(self) # 4
self.h1_layout = QHBoxLayout()
self.h2_layout = QHBoxLayout()
self.h3_layout = QHBoxLayout()
self.all_v_layout = QVBoxLayout()
self.layout_init()
self.radiobutton_init()
self.label_init()
def layout_init(self):
self.h1_layout.addWidget(self.on)
self.h1_layout.addWidget(self.off)
self.groupbox_1.setLayout(self.h1_layout)
self.h2_layout.addWidget(self.red)
self.h2_layout.addWidget(self.blue)
self.h2_layout.addWidget(self.green)
self.h2_layout.addWidget(self.yellow)
self.groupbox_2.setLayout(self.h2_layout)
self.h3_layout.addWidget(self.groupbox_1)
self.h3_layout.addWidget(self.groupbox_2)
self.all_v_layout.addWidget(self.pic_label)
self.all_v_layout.addLayout(self.h3_layout)
self.setLayout(self.all_v_layout)
def radiobutton_init(self):
self.yellow.setChecked(True) # 5
for btn in self.color_list:
btn.clicked.connect(self.change_color_func)
self.off.setChecked(True) # 6
self.off.toggled.connect(self.on_and_off_func)
def label_init(self): # 7
self.pic_label.setPixmap(QPixmap('images/Off.png'))
self.pic_label.setAlignment(Qt.AlignCenter)
def change_color_func(self):
if self.on.isChecked():
path = 'images/{}_light.png'.format([btn.text() for btn in self.color_list if btn.isChecked()][0])
self.pic_label.setPixmap(QPixmap(path))
def on_and_off_func(self):
if self.on.isChecked():
path = 'images/{}_light.png'.format([btn.text() for btn in self.color_list if btn.isChecked()][0])
self.pic_label.setPixmap(QPixmap(path))
else:
self.pic_label.setPixmap(QPixmap('images/Off_light.png'))
if __name__ == '__main__':
app = QApplication(sys.argv)
demo = Demo()
demo.show()
sys.exit(app.exec_())
```
QToolBox
工具箱,這個工具箱有很多的抽屜,每次只能打開一個,抽屜里面放了很多格式各樣的東西
```python
import sys
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QApplication, QToolBox, QGroupBox, QToolButton, QVBoxLayout
class Demo(QToolBox): # 1
def __init__(self):
super(Demo, self).__init__()
self.groupbox_1 = QGroupBox(self) # 2
self.groupbox_2 = QGroupBox(self)
self.groupbox_3 = QGroupBox(self)
self.toolbtn_f1 = QToolButton(self) # 3
self.toolbtn_f2 = QToolButton(self)
self.toolbtn_f3 = QToolButton(self)
self.toolbtn_m1 = QToolButton(self)
self.toolbtn_m2 = QToolButton(self)
self.toolbtn_m3 = QToolButton(self)
self.v1_layout = QVBoxLayout()
self.v2_layout = QVBoxLayout()
self.v3_layout = QVBoxLayout()
self.addItem(self.groupbox_1, 'Couple One') # 一個Item相當于一個抽屜
self.addItem(self.groupbox_2, 'Couple Two')
self.addItem(self.groupbox_3, 'Couple Three')
self.currentChanged.connect(self.print_index_func) # 5
self.layout_init()
self.groupbox_init()
self.toolbtn_init()
def layout_init(self):
self.v1_layout.addWidget(self.toolbtn_f1)
self.v1_layout.addWidget(self.toolbtn_m1)
self.v2_layout.addWidget(self.toolbtn_f2)
self.v2_layout.addWidget(self.toolbtn_m2)
self.v3_layout.addWidget(self.toolbtn_f3)
self.v3_layout.addWidget(self.toolbtn_m3)
def groupbox_init(self): # 6
self.groupbox_1.setFlat(True)
self.groupbox_2.setFlat(True)
self.groupbox_3.setFlat(True)
self.groupbox_1.setLayout(self.v1_layout)
self.groupbox_2.setLayout(self.v2_layout)
self.groupbox_3.setLayout(self.v3_layout)
def toolbtn_init(self): # 7
self.toolbtn_f1.setIcon(QIcon('images/cartoon1.ico'))
self.toolbtn_f2.setIcon(QIcon('images/cartoon2.ico'))
self.toolbtn_f3.setIcon(QIcon('images/cartoon3.ico'))
self.toolbtn_m1.setIcon(QIcon('images/cartoon4.ico'))
self.toolbtn_m2.setIcon(QIcon('images/close.ico'))
self.toolbtn_m3.setIcon(QIcon('images/cut.ico'))
def print_index_func(self):
couple_dict = {
0: 'Couple One',
1: 'Couple Two',
2: 'Couple Three'
}
sentence = 'You are looking at {}.'.format(couple_dict.get(self.currentIndex()))
print(sentence)
if __name__ == '__main__':
app = QApplication(sys.argv)
demo = Demo()
demo.show()
sys.exit(app.exec_())
```
### 14 窗口坐標
窗口分為三塊:標題欄,邊框,和客戶區
+ x()——得到窗口左上角在顯示屏屏幕上的x坐標;
+ y()——得到窗口左上角在顯示屏屏幕上的y坐標;
+ pos()——得到窗口左上角在顯示屏屏幕上的x和y坐標,類型為QPoint();
+ geometry().x()——得到客戶區左上角在顯示屏屏幕上的x坐標;
+ geometry().y()——得到客戶區左上角在顯示屏屏幕上的y坐標;
+ geometry()——得到客戶區左上角在顯示屏屏幕上的x和y坐標,以及客戶區的寬度和長度,類型為QRect();
+ width()——得到客戶區的寬度;
+ height()——得到客戶區的長度;
+ geometry().width()——得到客戶區的寬度;
+ geometry().height()——得到客戶區的長度;
+ frameGeometry().width()——得到窗口的寬度;
+ frameGeometry().height()——得到窗口的長度;
```python
import sys
from PyQt5.QtWidgets import QApplication, QWidget
if __name__ == '__main__':
app = QApplication(sys.argv)
widget = QWidget()
widget.resize(200, 200) # 1
widget.move(100, 100) # 2
# widget.setGeometry(100, 100, 200, 200) # 3
widget.show()
print('-----------------x(), y(), pos()-----------------')
print(widget.x())
print(widget.y())
print(widget.pos())
print('-----------------width(), height()-----------------')
print(widget.width())
print(widget.height())
print('-----------------geometry().x(), geometry.y(), geometry()-----------------')
print(widget.geometry().x())
print(widget.geometry().y())
print(widget.geometry())
print('-----------------geometry.width(), geometry().height()-----------------')
print(widget.geometry().width())
print(widget.geometry().height())
print('-----------------frameGeometry().x(), frameGeometry().y(), frameGeometry(), '
'frameGeometry().width(), frameGeometry().height()-----------------')
print(widget.frameGeometry().x())
print(widget.frameGeometry().y())
print(widget.frameGeometry())
print(widget.frameGeometry().width())
print(widget.frameGeometry().height())
sys.exit(app.exec_())
```
### 15 事件處理
#### 窗口關閉事件
```python
def closeEvent(self, QCloseEvent) 是QWidget的窗口關閉函數,通過重寫這個函數,可以定制化關閉的功能
QCloseEvent.accept() #接受窗口關閉的操作
QCloseEvent.ignore() #不接受窗口關閉的操作
```
#### 鼠標事件
```python
def mouseMoveEvent(self, QMouseEvent):
def mousePressEvent(self, QMouseEvent):
def mouseReleaseEvent(self, QMouseEvent):
def mouseDoubleClickEvent(self, QMouseEvent):
這四個函數都是QWidget的函數,作用分別是:鼠標移動觸發、鼠標按下的時候觸發、鼠標釋放的時候觸發
和鼠標雙擊的時候觸發。通過重構這四個函數,可以對鼠標事件進行定制化的功能。
```
+ Qt.LeftButton 、Qt.MidButton、Qt.RightButton:分別表示點擊的是左鍵、之間鍵、右鍵。
+ QMouseEvent.x()、QMouseEvent.y()表示獲取鼠標離程序的坐標
+ QMouseEvent.globalX()、QMouseEvent.globalY()表示鼠標離桌面的坐標
+ self.setMouseTracking(True) 表示讓窗口始終追蹤鼠標。
#### 鍵盤事件
```python
def keyPressEvent(self,QkeyEvent)
def keyReleaseEvent(self,QkeyEvent)
這個兩個函數式QWidget的函數,分別表示鍵盤任意鍵的按下和釋放。
```
+ QkeyEvent 表示接受的按鍵的值
### 16 拖放與剪貼板
拖放和剪貼板的功能原理基礎都是QMimeData類
| 判斷函數 | 獲取函數 | 設置函數 | MIME類型 |
| ---------- | ----------- | -------------- | ------------------- |
| hasText() | text() | setText() | text/plain |
| hasHtml() | html() | setHtml() | text/html |
| hasUrls() | urls() | setUrls() | text/uri-list |
| hasImage() | imageData() | setImageData() | image/* |
| hasColor() | colorData() | setColorData() | application/x-color |
#### 拖放
拖放分為拖動和放下兩個動作,它們涉及到以下的事件:
+ DragEnterEvent: 所拖動目標進入接收該事件的窗口或控件時觸發;
+ DragMoveEvent: 所拖動目標進入窗口或控件后,繼續被拖動時觸發;
+ DragLeaveEvent: 所拖動目標離開窗口或控件時觸發;
+ DropEvent: 所拖動目標被放下時觸發。
#### 剪貼板
```python
from PyQt5.QtWidgets import QApplication
self.clipboard = QApplication.clipboard() #實例化一個剪貼板
self.clipboard.setText("xxxxxx") #將內容放在剪切板中
self.clipboard.text() #取出剪貼板中的內容
```
+ dataChanged 當剪貼板中的內容發生變化時候,將觸發這個信號。
剪貼板的常用方法
### 17 列表控件、樹形控件、表格控件
QListWidget列表控件應當與QListWidgetItem一起使用,后者作為項被添加入列表控件中
QTreeWidget樹形控件應當與QTreeWidgetItem一起使用,后者作為項被添加入列表控件中
QTableWidget表格控件應當與QTableWidgetItem一起使用,后者作為項被添加入列表控件中
#### 列表控價
```python
from PyQt5.QtWidgets import QListWidget,QListWidgetItem
self.listwidget_1 = QListWidget(self) #實例化一個列表控件
#添加列表控件的幾種方式:
1.
self.item = QListWidgetItem(text)
self.listwidget_1.addItem(self.item)
2
self.item_6 = QListWidgetItem('Item 6', self.listwidget_1)
3
self.listwidget_1.addItem('Item 7')
4
str_list = ['Item 9', 'Item 10']
self.listwidget_1.addItems(str_list)
5
self.item_8 = QListWidgetItem('Item 8')
self.listwidget_1.insertItem(8, self.item_8)
```
+ currentItem() 獲取當前點擊的項
#### 樹形控件
```python
from PyQt5.QtWidgets import QTreeWidget, QTreeWidgetItem
self.tree = QTreeWidget(self) #實例化一個樹形控件
self.tree.setColumnCount(2) #設置顯示的列數,默認是一列的
self.tree.setHeaderLabels(['Install Components', 'Test']) #設置顯示的標題
#設置第一級項
self.preview = QTreeWidgetItem(self.tree)
self.preview.setText(0, 'Preview')
#設置第二級項
self.qt5112 = QTreeWidgetItem()
self.qt5112.setText(0, 'Qt 5.11.2 snapshot')
self.qt5112.setCheckState(0, Qt.Unchecked)
self.preview.addChild(self.qt5112)
#設置第三級項
choice_list = ['macOS', 'Android x86', 'Android ARMv7', 'Sources', 'iOS']
for i, c in enumerate(choice_list):
item = QTreeWidgetItem(self.qt5112)
item.setText(0, c)
item.setCheckState(0, Qt.Unchecked)
```
+ itemClicked 表示點擊item時自動觸發
#### 表格控件
```python
from PyQt5.QtWidgets import QTableWidget, QTableWidgetItem
class Demo(QTableWidget):
self.setRowCount(6) #設定表格的行數
self.setColumnCount(6) #設定表格的列數
self.setColumnWidth(0, 30) #設定列的大小
self.setRowHeight(0, 30) #設定行的大小
self.setHorizontalHeaderLabels(['h1', 'h2', 'h3', 'h4', ' h5', 'h6']) #設置列名
self.setVerticalHeaderLabels(['t1', 't2', 't3', 't4', 't5', 't6']) #設置行的名
self.item_1 = QTableWidgetItem('Hi') #設置表格里面的內容
self.setItem(0, 0, self.item_1)
self.setSpan(2, 2, 2, 2) #設置居中的格式,表示2行2列中有2列2行集中
```
### 18 滾動區域QScrollArea和滾動條QScollBar
```python
import sys
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPixmap
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QPushButton, QScrollArea, QScrollBar,QHBoxLayout, QVBoxLayout
class Demo(QWidget):
def __init__(self):
super(Demo, self).__init__()
self.label = QLabel(self)
self.label.setPixmap(QPixmap('image.jpg'))
self.label.setScaledContents(True) #設置圖片會隨著label便簽的變化而變化大小
self.scroll_area = QScrollArea(self) #初始化一個滾動區域
self.scroll_area.setWidget(self.label)
#將滾動區域的水平滾動條關閉
self.scroll_area.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.scrollbar = QScrollBar(Qt.Horizontal, self) #實例化一個水平的滾動條
#水平滾動條的大小和滾動區域水平滾動條的大小相同
self.scrollbar.setMaximum(self.scroll_area.horizontalScrollBar().maximum())
self.bigger_btn = QPushButton('Zoom in', self)
self.smaller_btn = QPushButton('Zoom out', self)
self.bigger_btn.clicked.connect(self.bigger_func)
self.smaller_btn.clicked.connect(self.smaller_func)
self.scrollbar.valueChanged.connect(self.sync_func)
self.h_layout = QHBoxLayout()
self.h_layout.addWidget(self.bigger_btn)
self.h_layout.addWidget(self.smaller_btn)
self.v_layout = QVBoxLayout()
self.v_layout.addWidget(self.scroll_area)
self.v_layout.addWidget(self.scrollbar)
self.v_layout.addLayout(self.h_layout)
self.setLayout(self.v_layout)
def bigger_func(self):
self.label.resize(self.label.width()*1.2, self.label.height()*1.2)
self.scrollbar.setMaximum(self.scroll_area.horizontalScrollBar().maximum())
def smaller_func(self):
self.label.resize(self.label.width() * 0.8, self.label.height() * 0.8)
self.scrollbar.setMaximum(self.scroll_area.horizontalScrollBar().maximum())
def sync_func(self):
#設置滾動區域水平滾動條的大小等于滾動條的大小
self.scroll_area.horizontalScrollBar().setValue(self.scrollbar.value())
if __name__ == '__main__':
app = QApplication(sys.argv)
demo = Demo()
demo.show()
sys.exit(app.exec_())
```
### 層疊樣式表
```python
import sys
from PyQt5.QtWidgets import QWidget, QApplication, QListWidget, QStackedWidget,\
QHBoxLayout, QFormLayout, QRadioButton, QLabel, QLineEdit, QCheckBox
class StackUi1(QWidget):
def __init__(self):
super().__init__()
layout = QFormLayout()
layout.addRow('姓名', QLineEdit())
layout.addRow('地址', QLineEdit())
self.setLayout(layout)
class StackUi2(QWidget):
def __init__(self):
super().__init__()
layout = QFormLayout()
sex = QHBoxLayout()
sex.addWidget(QRadioButton('男'))
sex.addWidget(QRadioButton('女'))
layout.addRow(QLabel('性別'), sex)
layout.addRow('生日', QLineEdit())
self.setLayout(layout)
class StackUi3(QWidget):
def __init__(self):
super().__init__()
layout = QHBoxLayout()
# 添加控件到布局中
layout.addWidget(QLabel('科目'))
layout.addWidget(QCheckBox('物理'))
layout.addWidget(QCheckBox('高數'))
self.setLayout(layout)
class Demo(QWidget):
def __init__(self):
super().__init__()
#設置窗口的初始位置和大小
self.setGeometry(300, 300, 30, 30)
self.setWindowTitle("層疊樣式")
# 創建三個小控件
self.stack1 = StackUi1()
self.stack2 = StackUi2()
self.stack3 = StackUi3()
#創建列表窗口
self.left_list = QListWidget()
# 創建層疊樣式表
self.stack = QStackedWidget()
self.init_stack()
self.init_layout()
self.left_list.currentRowChanged.connect(self.display)
def init_layout(self):
# 水平布局,添加部件到布局中
h_layout = QHBoxLayout()
h_layout.addWidget(self.left_list)
h_layout.addWidget(self.stack)
self.setLayout(h_layout)
def init_stack(self):
# 創建列表窗口,添加條目
self.left_list.insertItem(0, "聯系方式")
self.left_list.insertItem(1, "個人信息")
self.left_list.insertItem(2, "教育程度")
self.stack.addWidget(self.stack1)
self.stack.addWidget(self.stack2)
self.stack.addWidget(self.stack3)
def display(self, i):
# 設置當前可見的選項卡的索引
self.stack.setCurrentIndex(i)
if __name__ == '__main__':
app = QApplication(sys.argv)
demo = Demo()
demo.show()
sys.exit(app.exec_())
```
### 主窗口QMainWindow
主窗口類為我們提供了菜單欄(Menu Bar)、工具欄(Tool Bar)、控件停靠區域(Docke Widgets)和狀態欄(Status Bar)。
### 19 Qt中的多線程
```PYTHON
import sys
from PyQt5.QtCore import Qt, QThread, pyqtSignal
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QLabel, QVBoxLayout
class Demo(QWidget):
def __init__(self):
super(Demo, self).__init__()
self.button = QPushButton('Count', self)
self.button.clicked.connect(self.count_func)
self.label = QLabel('0', self)
self.label.setAlignment(Qt.AlignCenter)
self.my_thread = MyThread()
self.my_thread.my_signal.connect(self.set_label_func) # 3
self.v_layout = QVBoxLayout()
self.v_layout.addWidget(self.label)
self.v_layout.addWidget(self.button)
self.setLayout(self.v_layout)
def count_func(self):
self.my_thread.start()
def set_label_func(self, num): # 4
self.label.setText(num)
class MyThread(QThread):
my_signal = pyqtSignal(str) # 1
def __init__(self):
super(MyThread, self).__init__()
self.count = 0
def run(self):
while True:
print(self.count)
self.count += 1
self.my_signal.emit(str(self.count)) # 2
self.sleep(1)
if __name__ == '__main__':
app = QApplication(sys.argv)
demo = Demo()
demo.show()
sys.exit(app.exec_())
```
### 20、QT中的信號與槽
+ 一個信號連接一個槽
+ 多個信號連接一個槽
+ 一個信號連接另一個信號
+ 自定義信號
```python
#自定義信號
import sys
from PyQt5.QtCore import pyqtSignal # 1
from PyQt5.QtWidgets import QApplication, QWidget, QLabel
class Demo(QWidget):
my_signal = pyqtSignal() #定義信號 # 2
def __init__(self):
super(Demo, self).__init__()
self.label = QLabel('Hello World', self)
self.my_signal.connect(self.change_text) # 3
def change_text(self): #槽接受自定義信號
if self.label.text() == 'Hello World':
self.label.setText('Hello PyQt5')
else:
self.label.setText('Hello World')
def mousePressEvent(self, QMouseEvent): # 4
self.my_signal.emit() #觸發信號
if __name__ == '__main__':
app = QApplication(sys.argv)
demo = Demo()
demo.show()
sys.exit(app.exec_())
```
```pyt
#攜帶參數的自定義信號
import sys
from PyQt5.QtCore import pyqtSignal
from PyQt5.QtWidgets import QApplication, QWidget
class Demo(QWidget):
my_signal = pyqtSignal(int) #攜帶的值,需要說明類型
def __init__(self):
super(Demo, self).__init__()
self.my_signal.connect(self.signal_slot)
def signal_slot(self, x): 形參x接收
print('信號發射成功')
print(x)
def mouseDoubleClickEvent(self, event):
pos_x = event.pos().x()
self.my_signal.emit(pos_x)#觸發信號時攜帶參數
if __name__ == '__main__':
app = QApplication(sys.argv)
demo = Demo()
demo.show()
sys.exit(app.exec_())
```
```python
#把一個窗口的信息傳遞給另一個窗口時,可以把第一窗口期的實例化對象傳給第二個窗口,但是這樣的話,兩個窗口的耦合性太強了。可以在第一個窗口建立一個槽函數,第二個窗口建立信號。
import sys
from PyQt5.QtCore import pyqtSignal
from PyQt5.QtWidgets import QApplication, QWidget, QTextBrowser, QLineEdit, QPushButton, QHBoxLayout
class Window1(QTextBrowser): # 1
def __init__(self):
super(Window1, self).__init__()
def show_msg_slot(self, msg):
self.append(msg)
class Window2(QWidget): # 2
win2_signal = pyqtSignal(str)
def __init__(self):
super(Window2, self).__init__()
self.line = QLineEdit()
self.send_btn = QPushButton('發送')
self.send_btn.clicked.connect(self.send_to_win1_slot)
h_layout = QHBoxLayout()
h_layout.addWidget(self.line)
h_layout.addWidget(self.send_btn)
self.setLayout(h_layout)
def send_to_win1_slot(self):
msg = self.line.text()
self.win2_signal.emit(msg)
if __name__ == '__main__': # 3
app = QApplication(sys.argv)
win1 = Window1()
win1.show()
win2 = Window2()
win2.show()
win2.win2_signal.connect(win1.show_msg_slot) #信號與槽在此綁定,可以減少兩個類之間的耦合性
sys.exit(app.exec_())
```
```python
#線程之間的通信
import sys
import random
from PyQt5.QtCore import pyqtSignal, QThread
from PyQt5.QtWidgets import QApplication, QWidget, QTextBrowser, QPushButton, QVBoxLayout
class ChildThread(QThread):
child_signal = pyqtSignal(str) # 1
def __init__(self):
super(ChildThread, self).__init__()
def run(self): # 2
result = str(random.randint(1, 10000))
for _ in range(100000000):
pass
self.child_signal.emit(result)
class Demo(QWidget):
def __init__(self):
super(Demo, self).__init__()
self.browser = QTextBrowser() # 3
self.btn = QPushButton('開始爬取')
self.btn.clicked.connect(self.start_thread_slot)
v_layout = QVBoxLayout()
v_layout.addWidget(self.browser)
v_layout.addWidget(self.btn)
self.setLayout(v_layout)
self.child_thread = ChildThread() # 4
self.child_thread.child_signal.connect(self.child_thread_done_slot)
def start_thread_slot(self):
self.browser.clear()
self.browser.append('爬蟲開啟')
self.btn.setText('正在爬取')
self.btn.setEnabled(False)
self.child_thread.start()
def child_thread_done_slot(self, msg):
self.browser.append(msg)
self.browser.append('爬取結束')
self.btn.setText('開始爬取')
self.btn.setEnabled(True)
if __name__ == '__main__':
app = QApplication(sys.argv)
demo = Demo()
demo.show()
sys.exit(app.exec_())
```
### 21、布局管理
+ 垂直布局QVBoxLaout
```python
#通用情況
v_layout = QVBoxLaout()
v_latout.addWiget(xxxx1)
v_latout.addWiget(xxxx2)
self.setLayout(v_latout)
```
+ 水平布局QHBoxLayout
+ 混合使用QVBoxLaout和QHBoxLayout
+ 表單布局QFormLayout
```python
f_layout = QFormLayout()
v_layout = QVBoxLayout()
f_layout.addRow(xxx1, xxx2) #前面的為label,后面的為line
v_layout.addLayout(self.f_layout) #將表單布局加入其他的布局中
```
+ 網格布局QGridLaout
```python
grid_layout = QGridLayout()
grid_layout.addWidget(xxxx1, 0, 0, 1, 1) #第一行第一列,標簽的大小為占一行一列
```
### 學會使用文檔
1 安裝QtAssistant軟件,并下載文檔查看
2 在線文檔
如果不用QtAssistant軟件的話,我們也可以通過以下鏈接來進行文檔查詢:
http://pyqt.sourceforge.net/Docs/PyQt5/class_reference.html
[文檔地址1:https://doc.qt.io/qtforpython/modules.html](https://doc.qt.io/qtforpython/modules.html)
[文檔地址2:https://www.riverbankcomputing.com/static/Docs/PyQt5/sip-classes.html](https://www.rrbankcomputing.com/static/Docs/PyQt5/sip-classes.html)
## PyQt5圖形界面編程
### QWidget
```python
#屬性
setWindowTitle('學點編程吧出品') #設置標題
resize(250, 150) #調整控件的大小
move(300, 300) #移動到控件的位置,如果是最外層的控件則是屏幕的位置
from PyQt5.QtGui import QIcon
setWindowIcon(QIcon('xdbcb8.ico'))
setMouseTracking(True) #開啟鼠標跟蹤的功能,鼠標沒有按下也會接受鼠標的移動事件
update() #刷新控件。
```
```python
#方法
show() #顯示控件
def keyPressEvent(self, e): #QWdiget自帶的事件處理程序,當按下鍵盤時自動觸發,e觸發的事件,e.key()鍵盤輸入的值
def mouseMoveEvent(self, event): #QWiget控件自帶事件處理程序,當鼠標移動的時候觸發,需要開啟鼠標跟蹤的功能, event.x event.y 表示鼠標當前位置的坐標。
def mousePressEvent(self, e): #QWidget控件自帶事件處理程序,當單擊鼠標的時候自動觸發
def eventFilter(self, object, event) #事件過濾器。
```
### QDialog
```python
QWidget 是QDialog的父類
done(1)#退出控件
```
### PushButton
```python
QPushButton('按鍵名稱', self) #控件實例
setToolTip('點擊這里猜數字') #鼠標懸停在按鍵上面的時候出現提示,支持富文本
clicked #點擊事件,單擊松開為一個完整的點擊事件
```
### QLineEdit
```Python
QLineEdit('內容', self) #控件實例
text() #控件的內容
setFocus() #讓焦點置于文本框中,使文本處于選中的狀態
selectAll() #表示選文本框時,對里面的內容進行全選
clear() #對內容進行清除
from PyQt5.QtCore import Qt
setContextMenuPolicy(Qt.NoContextMenu) #禁止在文本框內右鍵彈出菜單
setPlaceholderText() #文本框為空的時候出現提示
setEchoMode(QLineEdit.Password) #設置顯示方式為密碼,輸入的值將不可見
from PyQt5.QtCore import QRegExp
from PyQt5.QtGui import QRegExpValidator
regx = QRegExp("^[a-zA-Z][0-9A-Za-z]{14}$") #在QLinEdit中加入正則顯示器
validator = QRegExpValidator(regx, ledit) #構造一個驗證器,該父對象接受與正則表達式匹配的所有字符串
setValidator(validator)
```
#顯示模式
| 方式 | 描述 |
| ---------------------------- | ------------------------------------------------ |
| QLineEdit.Normal | 顯示輸入的字符。這是默認值 |
| QLineEdit.NoEcho | 不要顯示任何東西,這可能適用于密碼長度保密的密碼 |
| QLineEdit.Password | 顯示密碼字符 |
| QLineEdit.PasswordEchoOnEdit | 在編輯時顯示字符,其他時候顯示密碼 |
### QMeeageBox
```python
QMessageBox.about(self, '內容') #控件實例
QMessageBox.question(self, "標題", "內容", QMessageBox.Yes | QMessageBox.No, QMessageBox.No) #
QMessageBox.critical(self, "內容", )
QMessageBox.warning(self, "內容", )
QMessageBox.information(self, "內容", )
msgBox = QMessageBox(QMessageBox.NoIcon, '關于','不要意淫了,早點洗洗睡吧!') #基于屬性的方式設置消息框的圖片
msgBox.setIconPixmap(QPixmap("images/screen2.jpg"))
```
```python
import sys
from PyQt5.QtWidgets import QMessageBox, QApplication, QWidget, QPushButton
class Demo(QWidget):
def __init__(self):
super(Demo, self).__init__()
btn = QPushButton("按鍵", self)
btn.clicked.connect(self.closeEvent)
def closeEvent(self, event):
reply = QMessageBox.question(self, '確認', '確認退出嗎', QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
if reply == QMessageBox.Yes:
event.accept()
else:
pass
if __name__ == '__main__':
app = QApplication(sys.argv)
demo = Demo()
demo.show()
sys.exit(app.exec_())
```
消息對話框的調用可以分為兩種1、靜態函數的調用;2、基于屬性的調用,上面的例子是靜態函數的調用,下面的例子是基于屬性的調用
```python
import sys
from PyQt5.QtWidgets import QMessageBox, QApplication, QWidget, QPushButton
from PyQt5.QtWidgets import QCheckBox, QLabel
class Demo(QWidget):
def __init__(self):
super(Demo, self).__init__()
btn = QPushButton("按鍵", self)
self.la = QLabel('這里將會顯示我們選擇的按鈕信息', self)
self.la.move(20,20)
btn.clicked.connect(self.closeEvent)
def closeEvent(self, event):
cb = QCheckBox('所有文檔都按此操作')
msgBox = QMessageBox()
msgBox.setWindowTitle('警告')
msgBox.setIcon(QMessageBox.Warning)
msgBox.setText('這是一個警告消息對話框')
msgBox.setInformativeText('出現更改愿意保存嗎?')
Save = msgBox.addButton('按鍵1', QMessageBox.AcceptRole)
msgBox.addButton('按鍵2', QMessageBox.RejectRole)
msgBox.addButton('按鍵3', QMessageBox.DestructiveRole)
msgBox.setDefaultButton(Save)
msgBox.setCheckBox(cb)
cb.stateChanged.connect(self.check)
reply = msgBox.exec_()
if reply == QMessageBox.AcceptRole:
self.la.setText('你選擇了保存!')
elif reply == QMessageBox.RejectRole:
self.la.setText('你選擇了取消!')
else:
self.la.setText('你選擇了不保存!')
def check(self):
if self.sender().isChecked():
self.la.setText('你打勾了哦')
else:
self.la.setText('怎么又不打了啊')
if __name__ == '__main__':
app = QApplication(sys.argv)
demo = Demo()
demo.show()
sys.exit(app.exec_())
```
按鍵的類型

### QLabel
```python
QLabel('內容',self)
setText("新的內容")
```
### QCheckBox
```python
Qt.Checked #2
Qt.PartiallyChecked #半選1
Qt.UnChecked #0
isChecked() #查詢狀態全選為True,半選為True,未選中為False
checkState() #查詢狀態,全選為2,半選為1,未選為0
setChecked(True) #設置狀態,True為全選,False為未選中 ,0為未選,1為半選不需要使能半選功能,2為全選
setTristate() #使能按鍵的半選功能,
```
### QDial
```python
valueChanged #值發生改變的信號
```
### QSlider
```python
```
### QPaintert
```python
drawLine(0, 0, self.pos.x(), self.pos.y())# 起點的坐標x,起點的坐標y,終點坐標x,終點坐標y
```
### 信號與槽
```python
#coding=utf-8
import sys
from PyQt5.QtWidgets import (QApplication, QWidget, QMessageBox)
from PyQt5.QtCore import (pyqtSignal, QObject)
class Signal(QObject):
showmouse = pyqtSignal()
class Example(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setGeometry(200, 200, 300, 300)
self.setWindowTitle('學點編程吧')
self.s = Signal()
self.s.showmouse.connect(self.about)
self.show()
def about(self):
QMessageBox.about(self,'鼠標','你點鼠標了吧!')
def mousePressEvent(self, e):
self.s.showmouse.emit()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
```
### 布局
```python
#QHBoxLayout,QVBoxLayout
addWidget(bt) #布局中增加控件
widget.setLayout(vbox)#控件中設置布局
addStretch(1) #控件中增加一個拉繩因子,里面的參數表示QSpacerItem的個數
#QGridLayout
addWidget(控件,0,0,3,0) #哪行,哪列,占多少行,占多少列
#QFormLayout
addRow(控件1,控件2)
```
### 顏色對話框
```python
col = QColorDialog.getColor() #打開顏色對話框,如果選擇的顏色有效,則設置TextEdit問選擇的當前顏色
if col.isValid():
self.tx.setTextColor(col)
```
### 字體對話框
```python
font, ok = QFontDialog.getFont() #打開顏色對話框,如果ok存在表示存在字體
tx.setCurrentFont(font) #TextEdit 設置選擇的字體
```
### 文件對話框
```python
fname = QFileDialog.getOpenFileName(self, '打開文件','./') #打開單個文件
fname = QFileDialog.getOpenFileName(self, '打開文件','./',("Images (*.png *.xpm *.jpg)")) #對打開的文件進行過濾
```
### QProgressDiaglog
```python
QProgressDialog(self)
setWindowTitle("請稍等") #設置標題
setLabelText("正在操作...") #設置內容
setCancelButtonText("取消") #添加按鍵
setWindowModality(Qt.WindowModal) #設置模式
setMinimumDuration(5) #設置最小顯示時間,自動計算花費時間,如果小于設置時間不顯示進度條
setRange(0,num) #進度條的范圍
setValue(i) #設置進度條的值
progress.wasCanceled(): #為True表示關閉進度條
```
#進度條的模式
| 屬性 | 描述 |
| ------------------- | ---------------------------------- |
| Qt.NonModal | 窗口不是模態的,不會阻止到其他輸入 |
| Qt.WindowModal | 單個模態窗口 |
| Qt.ApplicationModal | 所有窗口模態 |
```python
from PyQt5.QtWidgets import (QApplication, QWidget, QPushButton, QLabel, QLineEdit, QMessageBox, QProgressDialog)
from PyQt5.QtCore import Qt
import sys
class Example(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.resize(300,150)
self.setWindowTitle("微信公眾號:學點編程吧--進度對話框")
self.lb = QLabel("文件數量",self)
self.lb.move(20,40)
self.bt1 = QPushButton('開始',self)
self.bt1.move(20,80)
self.edit = QLineEdit('100000',self)
self.edit.move(100,40)
self.show()
self.bt1.clicked.connect(self.showDialog)
def showDialog(self):
num = int(self.edit.text())
progress = QProgressDialog(self)
progress.setWindowTitle("請稍等")
progress.setLabelText("正在操作...")
progress.setCancelButtonText("取消")
progress.setMinimumDuration(5)
progress.setWindowModality(Qt.WindowModal)
progress.setRange(0,num)
for i in range(num):
progress.setValue(i)
if progress.wasCanceled():
QMessageBox.warning(self,"提示","操作失敗")
break
else:
progress.setValue(num)
QMessageBox.information(self,"提示","操作成功")
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_()
```
### 雜
```python
from PyQt5.QtCore import QCoreApplication
QCoreApplication.instance().quit # QcoreApplication包含主事件循環,它處理和調度所有事件,instance()表示當前的實例。
```
一鍵復制
編輯
Web IDE
原始數據
按行查看
歷史
總結
以上是生活随笔為你收集整理的qtextedit 默认文案_QT中常用的控件说明.md的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c++ using 前置声明_C++ 类
- 下一篇: h5课件制作_Articulate st