PyQt5 系統(tǒng)化學(xué)習(xí): 對(duì)話框類控件

14 對(duì)話框類控件

《PyQt5快速開(kāi)發(fā)與實(shí)戰(zhàn)》學(xué)習(xí)筆記订雾。

對(duì)話框是一個(gè)現(xiàn)代 GUI 應(yīng)用不可或缺的一部分慈省。對(duì)話是兩個(gè)人之間的交流憔维,對(duì)話框就是人與電腦之間的對(duì)話炬守。對(duì)話框用來(lái)輸入數(shù)據(jù)牧嫉,修改數(shù)據(jù),修改應(yīng)用設(shè)置等等减途。

14.1 QDialog

為了更好地實(shí)現(xiàn)人機(jī)交互酣藻,比如 Windows 及 Linux 等系統(tǒng)均會(huì)提供一系列的標(biāo)準(zhǔn)對(duì)話框來(lái)完成特定場(chǎng)景下的功能,如選擇字號(hào)大小鳍置、字體顏色等辽剧。在 PyQt5 中定義了一系列的標(biāo)準(zhǔn)對(duì)話框類,讓使用者能夠方便和快捷地通過(guò)各個(gè)類完成字號(hào)大小税产、字體顏色以及文件的選擇等怕轿。

QDialog 類的子類主要有 QMessageBox坊夫、QFileDialog、QFontDialog撤卢、QInputDialog 等,QDialog類中的常用方法:

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *


class DialogDemo(QMainWindow):
    def __init__(self, parent=None):
        super(DialogDemo, self).__init__(parent)
        self.setWindowTitle("Dialog 例子")
        self.resize(350, 300)

        self.btn = QPushButton(self)
        self.btn.setText("彈出對(duì)話框")
        self.btn.move(50, 50)
        self.btn.clicked.connect(self.showdialog)

    def showdialog(self):
        dialog = QDialog()
        btn = QPushButton("ok", dialog)
        btn.move(50, 50)
        dialog.setWindowTitle("Dialog")
        dialog.setWindowModality(Qt.ApplicationModal)
        dialog.exec_()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    demo = DialogDemo()
    demo.show()
    sys.exit(app.exec_())

在這個(gè)例子中梧兼,Dialog 窗口的 WindowModality 屬性決定是否為模態(tài)或非模態(tài)放吩。當(dāng)用戶按下 Esc 鍵時(shí),對(duì)話框窗口將會(huì)默認(rèn)調(diào)用 QDialog.reject() 方法羽杰,然后關(guān)閉對(duì)話框窗口渡紫。

單擊 QWidget 窗口中的 PushButton 按鈕時(shí),將生成一個(gè)對(duì)話框窗口考赛。在對(duì)話框窗口的標(biāo)題欄上沒(méi)有最小化和最大化控件惕澎。以下代碼將給按鈕的clicked信號(hào)添加槽函數(shù)showdialog()。

self.btn.clicked.connect(self.showdialog)

由于 Dialog 窗口的 WindowModality 屬性設(shè)置為 Qt.ApplicationModal 模態(tài)颜骤,用戶只有關(guān)閉所彈出的對(duì)話框窗口后唧喉,才能關(guān)閉主窗口。以下代碼用于設(shè)置對(duì)話框模態(tài):

dialog.setWindowModality(Qt.ApplicationModal)

14.2 QMessageBox

QMessageBox 是一種通用的彈出式對(duì)話框忍抽,用于顯示消息八孝,允許用戶通過(guò)單擊不同的標(biāo)準(zhǔn)按鈕對(duì)消息進(jìn)行反饋。每個(gè)標(biāo)準(zhǔn)按鈕都有一個(gè)預(yù)定義的文本鸠项、角色和十六進(jìn)制數(shù)干跛。

QMessageBox 類提供了許多常用的彈出式對(duì)話框,如提示祟绊、警告楼入、錯(cuò)誤、詢問(wèn)牧抽、關(guān)于等對(duì)話框嘉熊。這些不同類型的 QMessageBox 對(duì)話框只是顯示時(shí)的圖標(biāo)不同,其他功能是一樣的阎姥。

QMessageBox 類中的常用方法:

QMessageBox 的標(biāo)準(zhǔn)按鈕類型:

5 種常用的消息對(duì)話框及其顯示效果:

QMessageBox 的使用:

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *


class WinForm(QWidget):
    def __init__(self):
        super(WinForm, self).__init__()
        self.setWindowTitle("QMessageBox 例子")
        self.resize(300, 100)
        self.myButton = QPushButton(self)
        self.myButton.setText("點(diǎn)擊彈出消息框")
        self.myButton.clicked.connect(self.msg)

    def msg(self):
            # 使用infomation信息框
        reply = QMessageBox.information(
            self, "標(biāo)題", "對(duì)話框消息正文", QMessageBox.Yes | QMessageBox.No,  QMessageBox.Yes)
        print(reply)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    demo = WinForm()
    demo.show()
    sys.exit(app.exec_())

效果:

14.3 輸入文字

QInputDialog 提供了一個(gè)簡(jiǎn)單方便的對(duì)話框记舆,可以輸入字符串,數(shù)字或列表:

from PyQt5.QtWidgets import (QWidget, QPushButton, QLineEdit, 
    QInputDialog, QApplication)
import sys

class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()


    def initUI(self):
        self.btn = QPushButton('Dialog', self)
        self.btn.move(20, 20)
        self.btn.clicked.connect(self.showDialog)

        self.le = QLineEdit(self)
        self.le.move(130, 22)

        self.setGeometry(300, 300, 290, 150)
        self.setWindowTitle('Input dialog')
        self.show()

    def showDialog(self):
        text, ok = QInputDialog.getText(self, 'Input Dialog', 
            'Enter your name:')
        if ok:
            self.le.setText(str(text))


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

效果:

更加復(fù)雜的例子:

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *


class InputdialogDemo(QWidget):
    def __init__(self, parent=None):
        super(InputdialogDemo, self).__init__(parent)
        layout = QFormLayout()
        self.btn1 = QPushButton("獲得列表里的選項(xiàng)")
        self.btn1.clicked.connect(self.getItem)
        self.le1 = QLineEdit()
        layout.addRow(self.btn1, self.le1)

        self.btn2 = QPushButton("獲得字符串")
        self.btn2.clicked.connect(self.getIext)
        self.le2 = QLineEdit()
        layout.addRow(self.btn2, self.le2)

        self.btn3 = QPushButton("獲得整數(shù)")
        self.btn3.clicked.connect(self.getInt)
        self.le3 = QLineEdit()
        layout.addRow(self.btn3, self.le3)
        self.setLayout(layout)
        self.setWindowTitle("Input Dialog 例子")

    def getItem(self):
        items = ("C", "C++", "Java", "Python")
        item, ok = QInputDialog.getItem(self, "select input dialog",
                                  "語(yǔ)言列表", items, 0, False)
        if ok and item:
            self.le1.setText(item)

    def getIext(self):
        text, ok = QInputDialog.getText(self, 'Text Input Dialog', '輸入姓名:')
        if ok:
            self.le2.setText(str(text))

    def getInt(self):
        num, ok = QInputDialog.getInt(self, "integer input dualog", "輸入數(shù)字")
        if ok:
            self.le3.setText(str(num))


if __name__ == '__main__':
    app = QApplication(sys.argv)
    demo = InputdialogDemo()
    demo.show()
    sys.exit(app.exec_())

14.4 選擇字體

QFontDialog 能做字體的選擇呼巴。

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *


class FontDialogDemo(QWidget):
    def __init__(self, parent=None):
        super(FontDialogDemo, self).__init__(parent)
        layout = QVBoxLayout()
        self.fontButton = QPushButton("choose font")
        self.fontButton .clicked.connect(self.getFont)
        layout.addWidget(self.fontButton)
        self.fontLineEdit = QLabel("Hello,測(cè)試字體例子")
        layout.addWidget(self.fontLineEdit)
        self.setLayout(layout)
        self.setWindowTitle("Font Dialog 例子")

    def getFont(self):
        font, ok = QFontDialog.getFont()
        if ok:
            self.fontLineEdit .setFont(font)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    demo = FontDialogDemo()
    demo.show()
    sys.exit(app.exec_())

效果:

14.5 選擇文件

QFileDialog 是用于打開(kāi)和保存文件的標(biāo)準(zhǔn)對(duì)話框泽腮。QFileDialog 類繼承自 QDialog 類。QFileDialog 在打開(kāi)文件時(shí)使用了文件過(guò)濾器衣赶,用于顯示指定擴(kuò)展名的文件诊赊。也可以設(shè)置使用 QFileDialog 打開(kāi)文件時(shí)的起始目錄和指定擴(kuò)展名的文件。

QFileDialog類中的常用方法:

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *


class filedialogdemo(QWidget):
    def __init__(self, parent=None):
        super(filedialogdemo, self).__init__(parent)
        layout = QVBoxLayout()
        self.btn = QPushButton("加載圖片")
        self.btn.clicked.connect(self.getfile)
        layout.addWidget(self.btn)
        self.le = QLabel("")
        layout.addWidget(self.le)
        self.btn1 = QPushButton("加載文本文件")
        self.btn1.clicked.connect(self.getfiles)
        layout.addWidget(self.btn1)
        self.contents = QTextEdit()
        layout.addWidget(self.contents)
        self.setLayout(layout)
        self.setWindowTitle("File Dialog 例子")

    def getfile(self):
        fname, _ = QFileDialog.getOpenFileName(
            self, 'Open file', 'c:\\', "Image files (*.jpg *.gif)")
        self.le.setPixmap(QPixmap(fname))

    def getfiles(self):
        dlg = QFileDialog()
        dlg.setFileMode(QFileDialog.AnyFile)
        dlg.setFilter(QDir.Files)

        if dlg.exec_():
            filenames = dlg.selectedFiles()
            f = open(filenames[0], 'r')

            with f:
                data = f.read()
                self.contents.setText(data)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = filedialogdemo()
    ex.show()
    sys.exit(app.exec_())

效果:

14.6 選取顏色

QColorDialog 提供顏色的選擇:

from PyQt5.QtWidgets import (QWidget, QPushButton, QFrame,
                             QColorDialog, QApplication)
from PyQt5.QtGui import QColor
import sys


class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        col = QColor(0, 0, 0)
        self.btn = QPushButton('Dialog', self)
        self.btn.move(20, 20)

        self.btn.clicked.connect(self.showDialog)

        self.frm = QFrame(self)
        self.frm.setStyleSheet("QWidget { background-color: %s }"
                               % col.name())
        self.frm.setGeometry(130, 22, 200, 200)

        self.setGeometry(300, 300, 450, 350)
        self.setWindowTitle('Color dialog')
        self.show()

    def showDialog(self):
        col = QColorDialog.getColor()
        if col.isValid():
            self.frm.setStyleSheet('QWidget { background-color: %s }'
                                   % col.name())


def main():
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

效果:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末府瞄,一起剝皮案震驚了整個(gè)濱河市碧磅,隨后出現(xiàn)的幾起案子碘箍,更是在濱河造成了極大的恐慌,老刑警劉巖鲸郊,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件丰榴,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡秆撮,警方通過(guò)查閱死者的電腦和手機(jī)四濒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)职辨,“玉大人盗蟆,你說(shuō)我怎么就攤上這事∈婵悖” “怎么了喳资?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)腾供。 經(jīng)常有香客問(wèn)我仆邓,道長(zhǎng),這世上最難降的妖魔是什么伴鳖? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任宏赘,我火速辦了婚禮,結(jié)果婚禮上黎侈,老公的妹妹穿的比我還像新娘察署。我一直安慰自己,他們只是感情好峻汉,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布贴汪。 她就那樣靜靜地躺著,像睡著了一般休吠。 火紅的嫁衣襯著肌膚如雪扳埂。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,950評(píng)論 1 291
  • 那天瘤礁,我揣著相機(jī)與錄音阳懂,去河邊找鬼。 笑死柜思,一個(gè)胖子當(dāng)著我的面吹牛岩调,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播赡盘,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼号枕,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了陨享?” 一聲冷哼從身側(cè)響起葱淳,我...
    開(kāi)封第一講書(shū)人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤钝腺,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后赞厕,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體艳狐,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年皿桑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了僵驰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡唁毒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出星爪,到底是詐尸還是另有隱情浆西,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布顽腾,位于F島的核電站近零,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏抄肖。R本人自食惡果不足惜久信,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望漓摩。 院中可真熱鬧裙士,春花似錦、人聲如沸管毙。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)夭咬。三九已至啃炸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間卓舵,已是汗流浹背南用。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留掏湾,地道東北人裹虫。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像融击,于是被迫代替她去往敵國(guó)和親恒界。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350