sponsored links

Qt For Python 「PySide6」 建立GUI - 07 Diaglogs

對話方塊是有用的 GUI 元件,允許您與使用者進行通訊(因此命名為對話方塊)。 它們通常用於檔案開啟/儲存、設定、首選項或不適合應用程式主 UI 的功能。 它們是位於主應用程式前面的小型模態(或阻斷)視窗,直到它們被關閉。 Qt 實際上為最常見的用例提供了許多“特殊”對話方塊,允許您提供平臺原生體驗以獲得更好的使用者體驗。

Qt For Python 「PySide6」 建立GUI - 07 Diaglogs


標準 GUI 功能 — 搜尋對話方塊

Qt For Python 「PySide6」 建立GUI - 07 Diaglogs


標準 GUI 功能 — 檔案開啟對話方塊

在 Qt 中,對話方塊由 QDialog 類處理。 要建立一個新對話方塊,只需建立一個傳入父類小部件的 QDialog 型別的新物件,例如 QMainWindow,作為它的父級。

讓我們建立我們自己的 QDialog。 我們將從一個簡單的骨架應用程式開始,它帶有一個按鈕,可以按下連線到一個槽方法。

# dialogs_start.py

import sys

from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.setWindowTitle("My App")

        button = QPushButton("Press me for a dialog!")
        button.clicked.connect(self.button_clicked)
        self.setCentralWidget(button)

    def button_clicked(self, s):
        print("click", s)

app = QApplication(sys.argv)

window = MainWindow()
window.show()

app.exec_()

在槽 button_clicked (從按鈕按下接收訊號)中,我們建立對話方塊例項,將 QMainWindow 例項作為父項傳遞。 這將使對話方塊成為 QMainWindow 的模式視窗。 這意味著對話方塊將完全阻止與父視窗的互動。

# dialogs_1.py

import sys

from PySide6.QtWidgets import QApplication, QDialog, QMainWindow, QPushButton

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.setWindowTitle("My App")

        button = QPushButton("Press me for a dialog!")
        button.clicked.connect(self.button_clicked)
        self.setCentralWidget(button)

    def button_clicked(self, s):
        print("click", s)

        dlg = QDialog(self)
        dlg.setWindowTitle("?")
        dlg.exec_()

app = QApplication(sys.argv)

window = MainWindow()
window.show()

app.exec_()

執行! 單擊該按鈕,您將看到一個空對話方塊。

建立對話方塊後,我們使用 .exec_() 啟動它 - 就像我們為 QApplication 建立應用程式的主事件迴圈一樣。 這不是巧合:當您執行 QDialog 時,會建立一個全新的事件迴圈,特定於對話方塊 ,被建立。

一個事件迴圈來規則它們

還記得之前說過在任何時候都只能執行一個 Qt 事件迴圈嗎? QDialog 完全阻止您的應用程式執行。 不要開始對話並期望在您的應用程式中的其他任何地方發生任何其他事情。 稍後我們將看到如何使用多執行緒來擺脫這種麻煩。

Qt For Python 「PySide6」 建立GUI - 07 Diaglogs

就像我們的第一個視窗一樣,這不是很有趣。 讓我們透過新增一個對話方塊標題和一組 OK 和 Cancel 按鈕來解決這個問題,以允許使用者接受或拒絕。

要自定義 QDialog,我們可以將其子類化。

# dialogs_2a.py

class CustomDialog(QDialog):
    def __init__(self):
        super().__init__()

        self.setWindowTitle("HELLO!")

        buttons = QDialogButtonBox.Ok | QDialogButtonBox.Cancel

        self.buttonBox = QDialogButtonBox(buttons)
        self.buttonBox.accepted.connect(self.accept)
        self.buttonBox.rejected.connect(self.reject)

        self.layout = QVBoxLayout()
        message = QLabel("Something happened, is that OK?")
        self.layout.addWidget(message)
        self.layout.addWidget(self.buttonBox)
        self.setLayout(self.layout)

在上面的程式碼中,我們首先建立了 QDialog 的子類,我們稱之為 CustomDialog。 對於 QMainWindow,我們在類 __init__ 塊中應用我們的自定義,以便在建立物件時應用我們的自定義。 首先,我們使用 .setWindowTitle() 為 QDialog 設定標題,與我們為主視窗所做的完全相同。

下一個程式碼塊與建立和顯示對話方塊按鈕有關。 這可能比您預期的要複雜一些。 然而,這是由於 Qt 在處理不同平臺上的對話方塊按鈕定位方面的靈活性。

簡單的辦法?

您當然可以選擇忽略這一點並在佈局中使用標準 QButton,但此處概述的方法可確保您的對話方塊遵守主機桌面標準(例如左側和右側的 OK)。 這些行為會讓你的使用者非常惱火,所以我不推薦它。

建立對話方塊按鈕框的第一步是使用 QDialogButtonBox 的名稱空間屬性定義要顯示的按鈕。 可用按鈕的完整列表如下:


按鈕型別


QDialogButtonBox.Ok


QDialogButtonBox.Open


QDialogButtonBox.Save


QDialogButtonBox.Cancel


QDialogButtonBox.Close


QDialogButtonBox.Discard


QDialogButtonBox.Apply


QDialogButtonBox.Reset


QDialogButtonBox.RestoreDefaults


QDialogButtonBox.Help


QDialogButtonBox.SaveAll


QDialogButtonBox.Yes


QDialogButtonBox.YesToAll


QDialogButtonBox.No


QDialogButtonBox.NoToAll


QDialogButtonBox.Abort


QDialogButtonBox.Retry


QDialogButtonBox.Ignore


QDialogButtonBox.NoButton

這些應該足以建立您能想到的任何對話方塊。 您可以透過使用管道 (|) 將它們組合在一起來構造一行多個按鈕。 Qt 將根據平臺標準自動處理訂單。 例如,要顯示我們使用的 OK 和 Cancel 按鈕:

buttons = QDialogButtonBox.Ok | QDialogButtonBox.Cancel

變數按鈕現在包含代表這兩個按鈕的整數值。 接下來,我們必須建立 QDialogButtonBox 例項來儲存按鈕。 要顯示的按鈕的標誌作為第一個引數傳入。

要使按鈕產生任何效果,您必須將正確的 QDialogButtonBox 訊號連線到對話方塊上的插槽。 在我們的例子中,我們已經將 QDialogButtonBox 的 .accepted 和 .rejected 訊號連線到 QDialog 子類上的 .accept() 和 .reject() 處理程式。

最後,要使 QDialogButtonBox 出現在我們的對話方塊中,我們必須將它新增到對話方塊佈局中。 因此,對於主視窗,我們建立一個佈局,並將我們的 QDialogButtonBox 新增到其中(QDialogButtonBox 是一個小部件),然後在我們的對話方塊上設定該佈局。

最後,我們在 MainWindow.button_clicked 槽中啟動 CustomDialog。

# dialogs_2a.py

    def button_clicked(self, s):
        print("click", s)

        dlg = CustomDialog()
        if dlg.exec_():
            print("Success!")
        else:
            print("Cancel!")

執行! 單擊以啟動對話方塊,您將看到一個帶有按鈕的對話方塊。

Qt For Python 「PySide6」 建立GUI - 07 Diaglogs

當您單擊按鈕啟動對話方塊時,您可能會注意到它出現在遠離父視窗的地方——可能在螢幕的中心。 通常,您希望對話框出現在其啟動視窗上,以便使用者更容易找到它們。 為此,我們需要為 Qt 提供對話方塊的父級。 如果我們將主視窗作為父視窗傳遞,Qt 將定位新對話方塊,使對話方塊的中心與視窗的中心對齊。

我們可以修改 CustomDialog 類以接受父引數。

# dialogs_2b.py

class CustomDialog(QDialog):

        # 我們將預設值設定為 None 以便我們可以根據需要省略父級。
    def __init__(self, parent=None):
        super().__init__(parent)

        self.setWindowTitle("HELLO!")

        buttons = QDialogButtonBox.Ok | QDialogButtonBox.Cancel

        self.buttonBox = QDialogButtonBox(buttons)
        self.buttonBox.accepted.connect(self.accept)
        self.buttonBox.rejected.connect(self.reject)

        self.layout = QVBoxLayout()
        message = QLabel("Something happened, is that OK?")
        self.layout.addWidget(message)
        self.layout.addWidget(self.buttonBox)
        self.setLayout(self.layout)

然後,當我們建立 CustomDialog 例項時,我們可以將主視窗作為引數傳入。 在我們的 button_clicked 方法中,self 是我們的主視窗物件。

# dialogs_2b.py

    def button_clicked(self, s):
        print("click", s)

        dlg = CustomDialog(self)
        if dlg.exec_():
            print("Success!")
        else:
            print("Cancel!")

執行! 單擊以啟動對話方塊,您應該會在父視窗的中間看到彈出的對話方塊。

Qt For Python 「PySide6」 建立GUI - 07 Diaglogs

恭喜! 您已經建立了第一個對話方塊。 當然,您可以繼續在對話方塊中新增任何其他您喜歡的內容。 只需像往常一樣將其插入到佈局中。

QMessageBox 訊息對話方塊

有許多對話方塊遵循我們剛剛看到的簡單模式——帶有按鈕的訊息,您可以使用這些按鈕接受或取消對話方塊。 雖然您可以自己構建這些對話方塊,但 Qt 還提供了一個名為 QMessageBox 的內建訊息對話方塊類。 這可用於建立資訊、警告、關於或問題對話方塊。

下面的示例建立一個簡單的 QMessageBox 並顯示它。

# dialogs_3.py

    def button_clicked(self, s):
        dlg = QMessageBox(self)
        dlg.setWindowTitle("I have a question!")
        dlg.setText("This is a simple dialog")
        button = dlg.exec_()

        if button == QMessageBox.Ok:
            print("OK!")

執行! 您將看到一個帶有 OK 按鈕的簡單對話方塊。

Qt For Python 「PySide6」 建立GUI - 07 Diaglogs

與我們已經看過的對話方塊按鈕一樣,顯示在 QMessageBox 上的按鈕也配置了一組常量,這些常量可以與 | 結合使用。 顯示多個按鈕。 可用按鈕型別的完整列表如下所示。


按鈕型別


QMessageBox.Ok


QMessageBox.Open


QMessageBox.Save


QMessageBox.Cancel


QMessageBox.Close


QMessageBox.Discard


QMessageBox.Apply


QMessageBox.Reset


QMessageBox.RestoreDefaults


QMessageBox.Help


QMessageBox.SaveAll


QMessageBox.Yes


QMessageBox.YesToAll


QMessageBox.No


QMessageBox.NoToAll


QMessageBox.Abort


QMessageBox.Retry


QMessageBox.Ignore


QMessageBox.NoButton

您還可以透過使用以下選項之一設定圖示來調整對話方塊中顯示的圖示。


圖示


描述


QMessageBox.NoIcon


訊息框沒有圖示


QMessageBox.Question


該訊息是在問一個問題


QMessageBox.Information


該訊息僅供參考


QMessageBox.Warning


該訊息是警告


QMessageBox.Critical


該訊息表明存在嚴重問題

例如,下面建立了一個帶有 Yes 和 No 按鈕的問題對話方塊。

# dialogs_4.py

import sys

# tag::imports[]
from PySide6.QtWidgets import QApplication, QDialog, QMainWindow, QMessageBox, QPushButton

# end::imports[]

# tag::MainWindow[]
class MainWindow(QMainWindow):
    # end::MainWindow[]
    def __init__(self):
        super().__init__()

        self.setWindowTitle("My App")

        button = QPushButton("Press me for a dialog!")
        button.clicked.connect(self.button_clicked)
        self.setCentralWidget(button)

    # tag::button_clicked[]

    # __init__ skipped for clarity
    def button_clicked(self, s):
        dlg = QMessageBox(self)
        dlg.setWindowTitle("I have a question!")
        dlg.setText("This is a question dialog")
        dlg.setStandardButtons(QMessageBox.Yes | QMessageBox.No)
        dlg.setIcon(QMessageBox.Question)
        button = dlg.exec_()

        if button == QMessageBox.Yes:
            print("Yes!")
        else:
            print("No!")

    # end::button_clicked[]

app = QApplication(sys.argv)

window = MainWindow()
window.show()

app.exec_()

執行! 您將看到一個帶有 Yes 和 No 按鈕的問題對話方塊。

Qt For Python 「PySide6」 建立GUI - 07 Diaglogs

內建 QMessageBox 對話方塊

為了使事情更簡單,QMessageBox 有許多方法可用於構造這些型別的訊息對話方塊。 這些方法如下所示。

QMessageBox.about(parent, title, message)
QMessageBox.critical(parent, title, message)
QMessageBox.information(parent, title, message)
QMessageBox.question(parent, title, message)
QMessageBox.warning(parent, title, message)

parent 引數是對話方塊的子視窗。 如果您從主視窗啟動對話方塊,則只需傳入 self. 下面的示例建立一個問題對話方塊,和以前一樣,帶有 Yes 和 No 按鈕。

# dialogs_5.py

import sys

from PySide6.QtWidgets import QApplication, QDialog, QMainWindow, QMessageBox, QPushButton

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.setWindowTitle("My App")

        button = QPushButton("Press me for a dialog!")
        button.clicked.connect(self.button_clicked)
        self.setCentralWidget(button)

    # tag::button_clicked[]
    def button_clicked(self, s):

        button = QMessageBox.question(self, "Question dialog", "The longer message")

        if button == QMessageBox.Yes:
            print("Yes!")
        else:
            print("No!")

    # end::button_clicked[]

app = QApplication(sys.argv)

window = MainWindow()
window.show()

app.exec_()

執行! 您將看到相同的結果,這次使用內建的 .question() 方法。

Qt For Python 「PySide6」 建立GUI - 07 Diaglogs

請注意,我們現在只調用對話方塊方法而不是呼叫 exec() 並建立對話方塊。 每個方法的返回值是被按下的按鈕。 我們可以透過將返回值與按鈕常量進行比較來檢測按下了什麼。

四個資訊、問題、警告和關鍵方法也接受可選按鈕和 defaultButton 引數,可用於調整對話方塊中顯示的按鈕並預設選擇一個。 通常,儘管您不想更改預設設定。

# dialogs_6.py

import sys

from PySide6.QtWidgets import QApplication, QDialog, QMainWindow, QMessageBox, QPushButton

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.setWindowTitle("My App")

        button = QPushButton("Press me for a dialog!")
        button.clicked.connect(self.button_clicked)
        self.setCentralWidget(button)

    # tag::button_clicked[]
    def button_clicked(self, s):

        button = QMessageBox.critical(
            self,
            "Oh dear!",
            "Something went very wrong.",
            buttons=QMessageBox.Discard | QMessageBox.NoToAll | QMessageBox.Ignore,
            defaultButton=QMessageBox.Discard,
        )

        if button == QMessageBox.Discard:
            print("Discard!")
        elif button == QMessageBox.NoToAll:
            print("No to all!")
        else:
            print("Ignore!")

    # end::button_clicked[]

app = QApplication(sys.argv)

window = MainWindow()
window.show()

app.exec_()

執行! 您將看到一個帶有自定義按鈕的關鍵對話方塊。

Qt For Python 「PySide6」 建立GUI - 07 Diaglogs

在大多數情況下,這些簡單的對話方塊就是您所需要的。

Dialogs

建立糟糕的對話特別容易。 從用令人困惑的選項困住使用者的對話方塊到巢狀的永無止境的彈出視窗。 有很多方法可以傷害您的使用者。

Qt For Python 「PySide6」 建立GUI - 07 Diaglogs

對話方塊按鈕由系統標準定義。 您可能從未注意到 macOS 和 Linux 與 Windows 上的“確定”和“取消”按鈕位於不同的位置,但您的大腦確實注意到了。 如果你不遵循系統標準,你會混淆你的使用者,讓他們犯錯誤。

Qt For Python 「PySide6」 建立GUI - 07 Diaglogs

透過 Qt,您可以在使用內建 QDialogButtonBox 控制元件時免費獲得這種一致性。 但你必須使用它們!

錯誤對話方塊會惹惱使用者。 當您顯示錯誤對話方塊時,您就是在給使用者帶來壞訊息。 當你告訴某人壞訊息時,你需要考慮它對他們的影響。

以我們在文件中遇到錯誤時產生的這個(幸好是虛構的)對話方塊為例。 該對話方塊告訴您存在錯誤,但既不說明後果是什麼,也不說明如何處理。 讀到這裡你的使用者會問(可能會尖叫)“……現在怎麼辦?”

Qt For Python 「PySide6」 建立GUI - 07 Diaglogs

這個來自 Acrobat Reader DC 的真實對話更好。 這解釋了存在錯誤、可能產生的後果以及可能的解決方法。

Qt For Python 「PySide6」 建立GUI - 07 Diaglogs

但這仍然不完美。 錯誤顯示為資訊對話方塊,這並不表明有任何錯誤。 該錯誤會在每個頁面上觸發,並且可以在文件中多次出現 - 警告對話方塊應該只觸發一次。 也可以透過明確錯誤是永久性的來改善錯誤。

Qt For Python 「PySide6」 建立GUI - 07 Diaglogs

好的錯誤訊息應該解釋一下。

  • 發生了什麼
  • 受影響的內容
  • 它的後果是什麼
  • 可以做些什麼
分類: 新聞
時間: 2021-09-19

相關文章

李飛飛團隊建立深度學習「遊樂場」:AI也在自我進化,細思極恐

李飛飛團隊建立深度學習「遊樂場」:AI也在自我進化,細思極恐
來源:Stanford 編輯:好睏 瘦瘦 [新智元導讀]近日,斯坦福李飛飛教授等人的研究「深度進化強化學習」登上nature子刊,首次證明了「鮑德溫效應」.或許,機器人形態的設計也可以透過一波「進化」 ...

堅持「早起」有多了不起?身體5個變化贏在起跑線

堅持「早起」有多了不起?身體5個變化贏在起跑線
有人說,那些真正厲害的人,從不熬夜通宵拼命,而是習慣用「早起」的方式開啟新的一天. 中國晚清時期政治家.戰略家曾國藩 一輩子堅持早起的習慣 並告誡子孫後代一定要早起 ▼ 中國現當代著名文學家梁實秋 黎 ...

為什麼我們不喜歡「周冬雨」排列?

為什麼我們不喜歡「周冬雨」排列?
當然,我們說的並不是周冬雨本人,而是被稱為「周冬雨」排列的螢幕. 這個問題不止數碼愛好者感興趣,就連女演員周冬雨本人,也在知乎問出了這樣的問題:周冬雨排列是什麼? 隨著 OPPO 釋出屏下攝像頭的解決 ...

二手值得買 | 小米 10 Pro:官網下架後反而更火的「真」旗艦

二手值得買 | 小米 10 Pro:官網下架後反而更火的「真」旗艦
或許這是小米數字系列歷史上最短命的旗艦了. 2020 年恰好是小米公司的 10 週年,年中推出了紀念版的小米 10 Ultra 不久後,小米官方就悄悄地讓它提前退市,讓位給小米 10 Ultra,作小 ...

首席評測官·我樂家居「之間」系列 尋找這個世界從未有過的美學

首席評測官·我樂家居「之間」系列 尋找這個世界從未有過的美學
首席測評官:Allen Chou 設計師Allen Chou,畢業自英國皇家美術學院,從事室內設計工作十五年,專注於高階家居設計,別墅.大平層等豪宅優秀設計案例100+,服務金領菁英使用者200+. ...

數字時代的「 局外人 」

數字時代的「 局外人 」
圖源:抖音公益微電影<局外人> " 隨著<中國網際網路絡發展狀況統計報告>顯示:60歲及以上的非網民約1.91億,約佔73.4%.父母輩成為了數字生活的局外人. 不會 ...

「翡翠」創匯期飄陽綠“連年有餘”翡翠圓佩

「翡翠」創匯期飄陽綠“連年有餘”翡翠圓佩
我是@田地裡的甲殼蟲!超級喜歡翡翠,深深陷入其中 ,不能自拔!藉助"今日頭條"這個平臺,和同好們學習,分享翡翠的知識和美圖! 讀書筆記 連年有餘是由蓮花和鯉魚組成的中國傳統的吉祥圖 ...

「查德」走進“查德湖”上的島嶼村莊

「查德」走進“查德湖”上的島嶼村莊
我們一行四人乘著吉普車,用了兩天半時間穿越喀麥隆北部,於2014年1月6日下午,到達了查德的首都恩賈梅納. 喀麥隆和查德的陸路海關就在恩賈梅納近郊,幸好我們司機的弟弟是這個關口的工作人員,我們沒有下車 ...

36氪獨家丨戶外家居品牌「Outer」完成5000萬美元B輪融資,估值較上一輪漲近10倍

36氪獨家丨戶外家居品牌「Outer」完成5000萬美元B輪融資,估值較上一輪漲近10倍
36氪獲悉,戶外家居品牌「Outer」近期已完成5000萬美元B輪融資,本輪融資由今日資本領投,Tribe Capital.C資本.Upfront Ventures以及老股東紅杉資本中國基金.Muck ...

糟滷拼盤 | 糟了!整個冰箱都不夠我拿來「滷」

糟滷拼盤 | 糟了!整個冰箱都不夠我拿來「滷」
夏將盡,秋已至.一晃神,今日就已經立秋了. 聽起來雖說是秋季的頭一個節氣,但暑氣還是不講道理賴著不散.何以解暑熱?唯有下酒菜! 對北方人民來說,「糟貨」可能有些陌生.不過對於包郵區來說,糟貨可是夏季必 ...

便秘,到底是身體哪裡出了問題?搞清楚才能「暢通無阻」

便秘,到底是身體哪裡出了問題?搞清楚才能「暢通無阻」
便秘有多痛苦,大概只有經歷過的人能懂,有人形容是:3 天拉不出來,小肚子彷彿懷胎 3 月 便秘的人也會嘗試各種各樣的方法: 瘋狂吃香蕉 喝酸奶.蜂蜜水 喝腸清茶.吃瀉藥 甚至灌腸.用開塞露 但有時根本 ...

大容量、更安全,能刷公交!「超級」功能的 SIM 卡,我並不推薦

大容量、更安全,能刷公交!「超級」功能的 SIM 卡,我並不推薦
近期,紫光國微在深交所「互動易」平臺上回答投資者的提問,表示公司的創新產品超級 SIM 卡已經實現了小批量出貨.而看到這個訊息的我,思緒在不經意間就飄到了 2019 年.那年 5G 超級 SIM 卡剛 ...

11款LV吉祥物「Vivienne」限量登場

11款LV吉祥物「Vivienne」限量登場
「Vivienne」絕對是LV 旗下眾多元素中最討喜的經典Icon之一.2018年「Vivienne」誕生後,於LV 所推出的各個產品系列中都常見其蹤影!範圍包含包包吊飾.包款皮夾.鑰匙圈.馬克杯及抱 ...

今年爆火「棋盤格」誰能不愛?洋氣百搭閉眼入

今年爆火「棋盤格」誰能不愛?洋氣百搭閉眼入
Hi,小姐妹們好呀! 這裡是你們的小萌主~ 姐妹們有沒有發現 今年的很多時尚元素裡 都有「棋盤格」的存在 不管是衣服.包包.鞋子 甚至耳飾髮飾也有棋盤格的影子 連地板.床品也有它的一席之地! 完全可以 ...

「生氣」如何一步步誘發心梗?《歐洲心臟雜誌》找到了真兇

「生氣」如何一步步誘發心梗?《歐洲心臟雜誌》找到了真兇
影視劇中常出現這樣的鏡頭:人在盛怒之時,突然捂緊胸口,倒地不起-- 這並沒有誇大「生氣」的可怕,現代醫學已經證實,生氣的確是心梗.冠心病的重要誘因. 近日,<歐洲心臟雜誌>發表的一項研究解 ...

回頭率 90% 以上的球鞋,全靠這些「細節」|《每週冷門球鞋大賞》

回頭率 90% 以上的球鞋,全靠這些「細節」|《每週冷門球鞋大賞》
和大家聊了這麼多期球鞋,從皮質聊到產地,從配色聊到科技,那都給阿正說完了可咋整?哈哈,放心~主題我來想,大家等著"上菜"就行!那今天的重點呢,我們就放在「回頭率」上,不知道對於大家 ...

「原創」海豐阿東:靈光一閃,一代神醫滅霍亂

「原創」海豐阿東:靈光一閃,一代神醫滅霍亂
「原創」海豐阿東:靈光一閃,一代神醫滅霍亂 醫術高明的中醫.往往是能夠根據當時的情況,因地制宜地解決問題.在乾隆16年.江陰,宜興等地發生了霍亂的疫情,因為人們對它不瞭解.一時也沒辦法加以治療,所以這 ...

「AI」滿中秋,月亮代表我的“芯”!月滿中秋闔家團圓

「AI」滿中秋,月亮代表我的“芯”!月滿中秋闔家團圓
「AI」滿中秋,月亮代表我的"芯" #中秋快樂 #醫療AI# 神州歸來萬里赴團圓 秋高氣爽,丹桂飄香恭祝神州十二號回家歡迎三位航天英雄凱旋有幸共同見證歷史時刻 月亮代表我的&quo ...

奶爸如何「迎戰」家庭負面情緒?”——禾一母嬰

奶爸如何「迎戰」家庭負面情緒?”——禾一母嬰
☊ 每晚22:35分,我在酒館和你說晚安 不知新手爸爸們是否有這樣的經歷,辛辛苦苦在外工作了一天回到家,開啟家門面對的卻是哭鬧不停的寶寶和不斷埋怨的妻子,本以為家是休憩的港灣,卻難以得到期望的平和與寧 ...