QT6 源,七章对话框与多窗体(8) 消息对话框 QMessageBox :属性,信号函数,成员函数,以及静态成员函数,源代码带注释

(1)消息对话框里,分为通知消息,询问消息,提醒消息,错误消息。可以直接使用本类的静态函数,简单。但 QT 的官方说明里,建议使用动态成员函数组件的消息框,而非使用静态函数。理由是静态函数里无法携带更多的文本内容。但基于 QMessageBox 的功能来定制消息框,更难

++

++

++

++还有很多的成员函数,来管理消息框里的按钮,涉及按钮的增删改查。就不一一列举了,感觉这不容易的知识。暂时不深学了。

(2)接着学习最后的静态成员函数

++测试一下

(3)本源代码定义于头文件 qmessagebox . h

cpp 复制代码
#ifndef QMESSAGEBOX_H
#define QMESSAGEBOX_H

#include <QtWidgets/qtwidgetsglobal.h>

#include <QtWidgets/qdialog.h>

QT_REQUIRE_CONFIG(messagebox);

QT_BEGIN_NAMESPACE

class QLabel;
class QMessageBoxPrivate;
class QAbstractButton;
class QCheckBox;

/*
The QMessageBox class provides a modal dialog for informing the user or
    for asking the user a question and receiving an answer.

Detailed Description :
-个消息框会显示主要文本以提醒用户某种情况,
进一步的说明性文本以进一步解释提醒内容或询问用户问题,
以及可选的详细文本以在用户请求时提供更多的数据。

消息框还可以显示图标和用于接受用户响应的标准按钮。

提供了两种使用QMessageBox的API,即基于属性的API和静态函数。
调用静态函数是更简单的方法,但其灵活性不如使用基于属性的API,且显示结果的信息量也较小。
建议使用基于属性的API。

The Property-based API :
要使用基于属性的API,首先需要构造一个QMessageBox的实例,然后设置所需的属性,
最后调用exec()来显示消息。最简单的配置方式仅设置消息文本属性。
     QMessageBox msgBox;
     msgBox.setText("The document has been modified.");
     msgBox.exec();

用户必须点击OK按钮才能关闭消息框。在消息框被关闭之前,其余的GUI将保持锁定状态。dismiss解散。

-个更好的方法不仅在于提醒用户注意某个事件,还在于询问用户对此应采取何种行动。
将这个问题存储在"信息文本属性"中,并将"标准按钮属性"设置为您想要的按钮集合,作为用户可能的响应选项。
这些按钮是通过使用按位或运算符结合来自"标准按钮"的值来指定的。
按钮的显示顺序取决于平台。例如,在Windows上,"保存"按钮会显示在"取消"按钮的左侧,
而在MacOS上,顺序则相反。
标记其中一个标准按钮为默认按钮。
    QMessageBox msgBox;
    msgBox.setText("The document has been modified.");
    msgBox.setInformativeText("Do you want to save your changes?");
    msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Discard
                                                | QMessageBox::Cancel  );
    msgBox.setDefaultButton(QMessageBox::Save);
    int ret = msgBox.exec();

这是《macOS指南》中推荐的做法。类似的指南也适用于其他平台,
但请注意不同平台在处理信息文本时的不同方式。

exec()插槽返回被点击按钮的标准按钮  StandardButtons 值。
    switch (ret) {
    case QMessageBox::Save:      // Save was clicked
       break;
    case QMessageBox::Discard:   // Don't Save was clicked
       break;
    case QMessageBox::Cancel:    // Cancel was clicked
       break;
    default:                     // should never be reached 这一条不应被达到
       break;
    }

为了向用户提供更多信息,以便他回答问题,应设置详细的  detailed text 文本属性。
如果设置了详细的  detailed text 文本属性, Show Details...  按钮将会显示。
Clicking the Show Details... button displays the detailed text.

Rich Text and the Text Format Property :
详细文本  detailed text 属性总是被解释为纯文本。
主文本  main text 和信息文本  informative text 属性可以是纯文本或富文本。
这些字符串将根据文本格式  text format 属性的设置来解释。默认设置为自动文本  auto-text。

请注意,对于某些包含XML元字符的纯文本字符串,
自动文本 auto-text,富文本检测测试  rich text detection test 可能会失败,
导致纯文本字符串被错误地解释为富文本。
在这些罕见的情况下,使用Qt::convertFromPlainText()将纯文本字符串转换为视觉上等效的富文本字符串,
或者使用setTextFormat()显式地设置文本格式  text format 属性。

Severity Levels and the Icon and Pixmap Properties :
QMessageBox支持四种预定义的讯息严重程度级别或讯息类型,
实际上它们之间的区别仅在于各自显示的预定义图标.
通过将图标 icon属性设置为预定义的图标之一,可以指定这四种预定义讯息  predefined icons类型之一。
以下规则仅供参考:
i      Information   For reporting information about normal operations.
问号?  Question      For asking a question during normal operations.
叹号!  Warning       For reporting non-critical errors.
叉 X   Critical      For reporting     critical errors.

预定义的图标并非由 QMessageBox定义,而是由样式提供。默认值为 NoIcon。
在所有情况下,消息框在其他方面是相同的。
在使用标准图标时,应采用表格中推荐的那个,或者采用适用于您平台的相关样式指南所推荐的那个。
如果没有任何标准图标适合您的消息框,您可以通过设置 icon pixmap属性(而非图标icon属性)来使用自定义图标。

总之,要设置图标,请使用setIcon()为标准图标之一设置图标,或者使用setIconPixmap()为自定义图标设置图标。

The Static Functions API  :
使用静态函数API构建消息框虽然方便,但其灵活性却不如使用基于属性的API,
因为静态函数签名中缺少用于设置信息性文本 informative text 和详细文本 detailed text 属性的参数。
一个变通方法是使用"标题title"参数作为消息框的主文本,而使用"文本text"参数作为消息框的信息性文本。
由于这种做法有明显的缺点,导致消息框的可读性降低,因此平台指南并不推荐使用。
微软Windows用户界面指南建议使用应用程序名称  application name 作为窗口的标题  window's title,
这意味着如果您除了主文本外还有一个信息性文本,您必须将其连接到text参数。

请注意,静态函数签名相对于其按钮参数已有所更改,
这些参数现在用于设置标准按钮  standard buttons 和默认按钮 default button。

静态函数可用于创建信息框information()、问题框question()、警告框warning()和关键消息框critical()。
 int ret = QMessageBox::warning(this, tr("My Application"),
        tr("The document has been modified.\n Do you want to save your changes?"),
        QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel,
        QMessageBox::Save);

标准对话框示例展示了如何使用QMessageBox和其他内置的Qt对话框。

Advanced Usage :
如果标准按钮 standard buttons不足以满足您的消息框需求,
您可以使用带文本和按钮角色 buttonRole 的`addButton()、重载函函数来添加自定义按钮。
`ButtonRole`由`QMessageBox`用于确定屏幕上按钮的排列顺序(各平台有所不同)。
在调用`exec()、后,您可以测试`clickedButton()、的值。例如:
 QMessageBox msgBox;
 QPushButton * connectButton = msgBox.addButton(tr("Connect"), QMessageBox::ActionRole);
 QPushButton *   abortButton = msgBox.addButton(QMessageBox::Abort);

 msgBox.exec();

 if (msgBox.clickedButton() == connectButton)      {    // connect
 } else if (msgBox.clickedButton() == abortButton) {    // abort
 }

Default and Escape Keys :
使用`setDefaultButton()、可以指定默认按钮(即按下Enter键时激活的按钮)。
如果没有指定默认按钮,`QMessageBox`会根据对话框中使用的按钮的按钮角色button roles尝试找到相应的默认按钮。

逃逸 escape 按钮(即按下 Esc 键时激活的按钮)可以使用 setEscapeButton()方法来指定。
如果没有指定逃逸按钮QMessageBox会尝试根据以下规则找到合适的按钮:
1.如果只有一个按钮,则该按钮在按下ESc时被激活。
2.如果有一个取消 Cancel按钮,它就是按下ESc时激活的按钮。
3.如果恰好有一个按钮具有拒绝角色 the Reject role或否定角色the the No role,则该按钮在按下ESc时被激活。
当无法通过这些规则确定退出按钮时,按下ESc没有效果。

*/

class Q_WIDGETS_EXPORT QMessageBox : public QDialog
{
    Q_OBJECT

    /*
    此属性持有消息框的图标
    消息框的图标可以通过以下值之一指定:
    QMessageBox::NoIcon
    QMessageBox::问题
    QMessageBox::信息
    QMessageBox::警告 warning
    QMessageBox::Critical
    默认值是QMessageBox::NoIcon。
    用于显示实际图标的像素图取决于当前的GUI样式。
    您还可以通过设置 iconPixmap属性来为图标设置自定义像素图。
    */
    Q_PROPERTY(Icon    icon        READ  icon        WRITE   setIcon) //官方图标

    Q_PROPERTY(QPixmap iconPixmap  READ  iconPixmap  WRITE   setIconPixmap) //自定义图标
    /*
    此属性持有当前图标。消息框当前使用的图标。
    请注意,通常很难绘制一个在所有GUI风格中都显得合适的像素图。
    您可能需要在每个平台上提供不同的像素图。
    默认情况下,此属性未定义。
    */


    //class QLabel::Q_PROPERTY(Qt::TextFormat textFormat ...)
    //这个枚举用于可以同时显示纯文本和富文本的小部件中,例如QLabel。
    //它用于决定是否将文本字符串解释为其中之一或另一种。
    //这通常是通过将一个eum值传递给 QTextEdit::setTextFormat ()函数来完成的。
    // enum Qt::TextFormat { //这是 label 上文本的格式
    //        PlainText, //文本字符串被解释为一个普通文本字符串。
    //         RichText, //文本字符串被解释为富文本字符串。请参阅支持的HTML子集以获取富文本的定义。
    //         AutoText, //如果Qt::mayBeRichText()返回true,
    //             //则将文本字符串解释为Qt::RichText;否则,将其解释为Qt::PlainText.
    //     MarkdownText  //文本字符串被解释为Markdown格式化的文本。此枚举值在Qt5.14中添加。
    //};
    Q_PROPERTY(Qt::TextFormat               textFormat      //默认格式为Qt::AutoText。
                READ                        textFormat      WRITE     setTextFormat)
    //此属性保存消息框显示文本的格式。消息框当前使用的文本格式。


    /*
    此属性持有要显示的消息框文本。
    文本将被解释为纯文本或富文本,具体取决于文本格式设置(QMessageBox::textFormat).
    默认设置为 Qt::AutoText,即消息框将尝试自动检测文本的格式。
    此属性的默认值为空字符串。
    */
    Q_PROPERTY(QString                      text
                READ                        text            WRITE     setText)

    /*
    此属性包含提供消息更详细描述的信息文本。
    说明性文本可以用来扩展`text()',以向用户提供更多信息。
    在Mac上,该文本会显示在`text()、下方,采用小型系统字体。
    在其他平台上,它只是被附加到已有的文本上。
    默认情况下,此属性包含一个空字符串。
    */
    Q_PROPERTY(QString           informativeText
                READ             informativeText            WRITE     setInformativeText)

    Q_PROPERTY(QString              detailedText
                READ                detailedText            WRITE     setDetailedText)
    /*
    此属性包含在详细信息区域中要显示的文本。文本将被解释为纯文本。默认情况下,此属性包含一个空字符串。
    */

    //指定消息框标签应如何与用户输入交互。默认值取决于样式。
    Q_PROPERTY(Qt::TextInteractionFlags     textInteractionFlags
                READ                        textInteractionFlags
                WRITE                    setTextInteractionFlags)
    /*
    //QLabel :: Q_PROPERTY(Qt::TextInteractionFlags textInteractionFlags
    //    READ textInteractionFlags WRITE setTextInteractionFlags)
    //本枚举类应用于标签的 属性 textInteractionFlags.本属性也用于文本框.
    //这个枚举定义了文本显示控件如何对用户输入做出反应。
    enum Qt::TextInteractionFlag {
        NoTextInteraction         = 0, //无法与文本进行交互。
        TextSelectableByMouse     = 1, //文本可以通过鼠标选择,
            //并使用上下文菜单或标准键盘快捷键复制到剪贴板。
        TextSelectableByKeyboard  = 2, //可以通过键盘上的光标键选择文本。显示一个文本光标。
        LinksAccessibleByMouse    = 4, //链接可以通过鼠标进行高亮和激活。
        LinksAccessibleByKeyboard = 8, //链接可以通过按Tab键进行聚焦,并通过按Enter键激活。
        TextEditable              = 16,//文本可以完全编辑。

        TextEditorInteraction     =   TextSelectableByMouse
                                    | TextSelectableByKeyboard
                                    | TextEditable,         //default for a text editor.

        TextBrowserInteraction    =   TextSelectableByMouse //default for QTextBrowser.
                                    | LinksAccessibleByMouse
                                    | LinksAccessibleByKeyboard
    };
    Q_DECLARE_FLAGS(TextInteractionFlags, TextInteractionFlag)
    Q_DECLARE_OPERATORS_FOR_FLAGS(TextInteractionFlags)
    */

    //消息框中标准按钮的集合.此属性控制消息框使用的标准按钮。默认情况下,此属性不包含任何标准按钮。
    Q_PROPERTY(StandardButtons     standardButtons
                READ               standardButtons
                WRITE           setStandardButtons)


protected:
    bool         event(QEvent       * e    ) override;
    void   resizeEvent(QResizeEvent * event) override;
    void     showEvent(QShowEvent   * event) override;
    void    closeEvent(QCloseEvent  * event) override;
    void keyPressEvent(QKeyEvent    * event) override;
    void   changeEvent(QEvent       * event) override;

private:
    Q_PRIVATE_SLOT(d_func(), void _q_buttonClicked(QAbstractButton *))

    Q_PRIVATE_SLOT(d_func(), void _q_clicked(QPlatformDialogHelper::StandardButton,
                                             QPlatformDialogHelper::ButtonRole))

    Q_DISABLE_COPY(QMessageBox)
    Q_DECLARE_PRIVATE(QMessageBox)


Q_SIGNALS:
    void buttonClicked(QAbstractButton * button);

public :
    using QDialog::open; //将对话框显示为窗口模态 window modal dialog对话框,并立即返回。
    //virtual void QDialog::open();
    void open(QObject * receiver, const char * member); //信息与槽函数
    //Opens the dialog and connects its finished() or buttonClicked() signal to the
    //  slot specified by receiver and member.
    //If the slot in member has a pointer for its first parameter, //若槽函数的形参一是指针,
    //  the connection is to buttonClicked(),       //则连接到 buttonClicked(ptr)信号函数;
    //  otherwise the connection is to finished().  //否则连接到 finished(int)信号函数
    //The signal will be disconnected from the slot when the dialog is closed.

public:

    explicit QMessageBox(QWidget * parent = nullptr);

    QMessageBox(Icon icon, const QString & title, const QString & text,
                StandardButtons buttons = NoButton,     QWidget * parent = nullptr,
                Qt::WindowFlags flags = Qt::Dialog | Qt::MSWindowsFixedSizeDialogHint);

    ~QMessageBox();

    enum Icon { // keep this in sync with QMessageDialogOptions::Icon
        NoIcon      = 0,
        Information = 1, //表明这条消息没有什么特别之处。
        Warning     = 2, //表示该消息是警告,但可以处理。
        Critical    = 3, //表明该消息代表了一个关键问题。
        Question    = 4  //表明该消息正在提出一个问题。
    };
    Q_ENUM(Icon)
//   Q_PROPERTY(Icon        icon
//              READ        icon           WRITE   setIcon) //官方图标
                Icon        icon() const;
                void     setIcon(Icon);


//   Q_PROPERTY(QPixmap     iconPixmap
//              READ        iconPixmap     WRITE   setIconPixmap) //自定义图标
                QPixmap     iconPixmap() const;
                void     setIconPixmap(const QPixmap &pixmap);

// // enum Qt::TextFormat { PlainText, RichText, AutoText, MarkdownText };
//   Q_PROPERTY(Qt::TextFormat                  textFormat      //默认格式为Qt::AutoText。
//              READ                            textFormat      WRITE     setTextFormat)
                Qt::TextFormat                  textFormat() const;
                void                         setTextFormat(Qt::TextFormat format);

//   Q_PROPERTY(QString                          text      // 最基础的消息文本
//              READ                             text      WRITE     setText)
                QString                          text() const;
                void                          setText(const QString & text);

//   Q_PROPERTY(QString               informativeText      //更详细描述的信息文本
//              READ                  informativeText      WRITE     setInformativeText)
                QString               informativeText() const;
                void               setInformativeText(const QString & text);


//   Q_PROPERTY(QString                  detailedText      //detailed 中的文本
//              READ                     detailedText      WRITE     setDetailedText)
                QString                  detailedText() const;
                void                  setDetailedText(const QString & text);

// //指定消息框标签应如何与用户输入交互,如何选中,如何编辑,是否打开超链接等等。默认值取决于样式。
//   Q_PROPERTY(Qt::TextInteractionFlags         textInteractionFlags
//              READ                             textInteractionFlags
//              WRITE                         setTextInteractionFlags)
                Qt::TextInteractionFlags         textInteractionFlags() const;
                void setTextInteractionFlags(Qt::TextInteractionFlags flags);

    //keep this in sync with QDialogButtonBox::StandardButton and
    //  QPlatformDialogHelper::StandardButton
    //这些枚举描述了标准按钮的标志。每个按钮都有一个定义的ButtonRole。
    enum StandardButton {
        NoButton           = 0x00000000,
        Ok                 = 0x00000400,
        Save               = 0x00000800,
        SaveAll            = 0x00001000,
        Open               = 0x00002000,
        Yes                = 0x00004000,
        YesToAll           = 0x00008000,
        No                 = 0x00010000,
        NoToAll            = 0x00020000,
        Abort              = 0x00040000,
        Retry              = 0x00080000,
        Ignore             = 0x00100000,
        Close              = 0x00200000,
        Cancel             = 0x00400000,
        Discard            = 0x00800000,
        Help               = 0x01000000,
        Apply              = 0x02000000,
        Reset              = 0x04000000,
        RestoreDefaults    = 0x08000000,

        FirstButton        = Ok,                // internal
        LastButton         = RestoreDefaults,   // internal

        YesAll             = YesToAll,          // obsolete 过时的
        NoAll              = NoToAll,           // obsolete

        Default            = 0x00000100,        // obsolete
        Escape             = 0x00000200,        // obsolete
        FlagMask           = 0x00000300,        // obsolete
        ButtonMask         = ~FlagMask          // obsolete
    };
    typedef StandardButton Button; //在 Qt7以下有此定义
    Q_DECLARE_FLAGS(StandardButtons, StandardButton)
    Q_FLAG(StandardButtons)
//   Q_PROPERTY(StandardButtons          standardButtons   //消息框中标准按钮的集合.
//              READ                     standardButtons
//              WRITE                 setStandardButtons)
                StandardButtons          standardButtons() const;
                StandardButton           standardButton(QAbstractButton * button ) const;
                void                  setStandardButtons(StandardButtons  buttons);


    void setWindowTitle   (const QString & title);
    void setWindowModality(Qt::WindowModality windowModality);
    //enum Qt::WindowModality { NonModal,  WindowModal, ApplicationModal };

    //返回对话框中显示的复选框。如果没有设置复选框,则为nullptr。
    QCheckBox       *                    checkBox() const;
    void                              setCheckBox(QCheckBox * cb);
    //在消息对话框上设置复选框 cb。该消息框将拥有复选框的权限take ownership。
    //参数cb可以设为 nullptr,以从消息框中移除现有的复选框。

    //这个枚举描述了可用于描述按钮盒中按钮的角色。这些角色的组合用作标志,以描述其行为的不同方面。
    // keep this in sync with QDialogButtonBox::ButtonRole and
    //  QPlatformDialogHelper::ButtonRole
    enum ButtonRole {
            InvalidRole = -1, //The button is invalid.
        //Clicking the button causes the dialog to be accepted (e.g. OK).
             AcceptRole, //点击按钮会接受对话框(例如:确定)
        //Clicking the button causes the dialog to be rejected (e.g. Cancel).
             RejectRole,
        DestructiveRole, //点击按钮会导致破坏性更改(例如,放弃更改)并关闭对话框。
             ActionRole, //点击按钮会改变对话框中的元素。
               HelpRole, //可以点击按钮请求帮助。
                YesRole, //The button is a "Yes"-like button.
                 NoRole, //The button is a "No"-like button.
              ResetRole, //该按钮将对话框的字段重置为默认值。
              ApplyRole, //The button applies current changes.

        NRoles
    };
    //返回一个指向标准按钮 which的指针,如果此消息框中不存在标准按钮,则返回nullptr。
    QAbstractButton *                button (StandardButton   which ) const;
    QAbstractButton *         clickedButton () const; //返回用户点击的按钮,
    //如果用户按下了 ESc键且未设置 escape button按钮,则返回nullptr。
    //如果exec()尚未被调用,返回nullptr。
    QList<QAbstractButton *>         buttons() const; //返回已添加到消息框的所有按钮的列表。
    ButtonRole                       buttonRole(QAbstractButton * button) const;
    //返回指定按钮的按钮角色。如果按钮为空指针或尚未添加到消息框中,此函数将返回InvalidRole。

    //Adds a standard button to the message box if it is valid to do so,
    //  and returns the push button.
    QPushButton     *             addButton(StandardButton    button);
    //Adds the given button to the message box with the specified role.
    void                          addButton(QAbstractButton * button, ButtonRole role);
    QPushButton     *             addButton(const QString   & text  , ButtonRole role);
    //Creates a button with the given text,
    //  adds it to the message box for the specified role, and returns it.
    void                       removeButton(QAbstractButton * button);
    //Removes button from the button box without deleting it.


    QPushButton     *         defaultButton() const;
    void                   setDefaultButton(QPushButton     * button);
    void                   setDefaultButton(StandardButton    button);

    QAbstractButton *         escapeButton() const; //在上面的总注释里有一些介绍
    void                   setEscapeButton(QAbstractButton  * button);
    void                   setEscapeButton(StandardButton     button);


//*******************************************************************************
//**************************以下是重要的静态成员函数*********************************
//**************************返回值是枚举量的是新函数*********************************
//*******************************************************************************

    static StandardButton information(QWidget * parent, const QString & title,
         const QString & text, StandardButtons buttons = Ok,  //通知消息
         StandardButton defaultButton = NoButton);

    // needed as long as we have int overloads //在 Qt7以下有此定义
    inline static StandardButton information(QWidget *parent, const QString &title,
                                  const QString& text,
                                  StandardButton button0, StandardButton button1 = NoButton)
    { return information(parent, title, text, StandardButtons(button0), button1); }


    static StandardButton question   (QWidget * parent, const QString & title,
         const QString & text, StandardButtons buttons = StandardButtons(Yes | No),
         StandardButton defaultButton = NoButton);            //询问消息

    inline static int question(QWidget *parent, const QString &title, //在 Qt7以下有此定义
                               const QString& text,
                               StandardButton button0, StandardButton button1)
    { return question(parent, title, text, StandardButtons(button0), button1); }


    static StandardButton warning    (QWidget * parent, const QString & title,
         const QString & text, StandardButtons buttons = Ok,  //警告消息
         StandardButton defaultButton = NoButton);


    inline static int warning(QWidget *parent, const QString &title, //在 Qt7以下有此定义
                              const QString& text,
                              StandardButton button0, StandardButton button1)
    { return warning(parent, title, text, StandardButtons(button0), button1); }


    static StandardButton critical   (QWidget * parent, const QString & title,
         const QString & text, StandardButtons buttons = Ok,   //错误消息
         StandardButton defaultButton = NoButton);


    inline static int critical(QWidget *parent, const QString &title, //在 Qt7以下有此定义
                               const QString& text,
                               StandardButton button0, StandardButton button1)
    { return critical(parent, title, text, StandardButtons(button0), button1); }


    static void about  (QWidget * parent, const QString & title, const QString & text);
    static void aboutQt(QWidget * parent, const QString & title = QString());

#if QT_DEPRECATED_SINCE(6,2)  //有此定义,都是 QT6.2 里过时的函数,略
    // the following functions are obsolete 过时的:
#endif

}; //完结 class QMessageBox : public QDialog

Q_DECLARE_OPERATORS_FOR_FLAGS(QMessageBox::StandardButtons)

#define QT_REQUIRE_VERSION(argc, argv, str) { QString s = QString::fromLatin1(str);\
QString sq = QString::fromLatin1(qVersion()); \
if ((sq.section(QChar::fromLatin1('.'),0,0).toInt()<<16)+\
(sq.section(QChar::fromLatin1('.'),1,1).toInt()<<8)+\
sq.section(QChar::fromLatin1('.'),2,2).toInt()<(s.section(QChar::fromLatin1('.'),0,0).toInt()<<16)+\
(s.section(QChar::fromLatin1('.'),1,1).toInt()<<8)+\
s.section(QChar::fromLatin1('.'),2,2).toInt()) { \
if (!qApp){ \
    new QApplication(argc,argv); \
} \
QString s = QApplication::tr("Executable '%1' requires Qt "\
 "%2, found Qt %3.").arg(qAppName()).arg(QString::fromLatin1(\
str)).arg(QString::fromLatin1(qVersion())); QMessageBox::critical(0, QApplication::tr(\
"Incompatible Qt Library Error"), s, QMessageBox::Abort, 0); qFatal("%s", s.toLatin1().data()); }}

QT_END_NAMESPACE

#endif // QMESSAGEBOX_H

(4)

谢谢

相关推荐
程序员编程指南2 小时前
Qt开发环境搭建全攻略(Windows+Linux+macOS)
linux·c语言·c++·windows·qt
wwww.wwww8 小时前
使用qt编写上位机程序,出现串口死掉无法接受数据的bug
c++·qt·bug
攻城狮7号15 小时前
【AI时代速通QT】第五节:Qt Creator如何引入第三方库,以OpenCV为例
c++·windows·qt·opencv·第三方库
钱彬 (Qian Bin)1 天前
《使用Qt Quick从零构建AI螺丝瑕疵检测系统》——0. 博客系列大纲
人工智能·qt·qml·瑕疵检测·qt quick·yolo8·工业质检
不做无法实现的梦~1 天前
stm32mp157f-dk2安装镜像并且部署qt全流程
stm32·嵌入式硬件·qt
她叫我大水龙1 天前
Qt中的多线程
c++·qt
hellokandy2 天前
QT Windows 资源管理器的排序规则
windows·qt·sort·qcollator
蜡笔小欣丫2 天前
USB导出功能(QT)
开发语言·qt
真的想上岸啊2 天前
学习C++、QT---27(QT中实现记事本项目实现行列显示、优化保存文件的功能的讲解)
c++·qt·学习