Le code de fonction Qt setWindowFlags (Qt :: Window) analyse les fenêtres non modales et domine la fenêtre

Si vous avez besoin d'une fenêtre pour prendre en charge les fenêtres modales et non modales, vous devez généralement remplacer la fenêtre par QDailog,

Un point clé pour réaliser cette fonction est de définir le setStyleSheet (Qt :: Window), le code source est le suivant:

        Widget = 0x00000000,

        Fenêtre = 0x00000001,

        Dialogue = 0x00000002 | Fenêtre ,

 

Si vous avez besoin d'une fenêtre pour prendre en charge les fenêtres modales et non modales, vous devez généralement remplacer la fenêtre par QDailog,

Un point clé pour réaliser cette fonction est de définir le setStyleSheet (Qt :: Window), le code source est le suivant:

        Widget = 0x00000000,

        Fenêtre = 0x00000001,

        Dialogue = 0x00000002 | Fenêtre ,

 

Qt :: Dialogue

0x00000002 | Fenêtre

Indique que le widget est une fenêtre qui doit être décorée comme une boîte de dialogue (c'est-à-dire, généralement pas de boutons de maximisation ou de réduction dans la barre de titre). Il s'agit du type par défaut pour QDialog . Si vous souhaitez l'utiliser comme boîte de dialogue modale, il doit être lancé à partir d'une autre fenêtre ou avoir un parent et utilisé avec la propriété QWidget :: windowModality . Si vous le rendez modal, la boîte de dialogue empêchera les autres fenêtres de niveau supérieur de l'application d'obtenir des entrées. Nous nous référons à une fenêtre de niveau supérieur qui a un parent comme fenêtre secondaire .

 

 

QDialog peut-il être utilisé pour réaliser la fonction des boîtes de dialogue modales et non modales, existe-t-il un autre moyen d'obtenir des fonctions similaires, QWidget peut-il être utilisé pour obtenir des effets similaires, QWidget peut-il être utilisé pour obtenir la fonction de fenêtre supérieure et des boîtes de dialogue non modales , Si l'exigence ne nécessite pas de boîte de dialogue modale, seuls le haut de la fenêtre et la fenêtre non modale sont nécessaires, vous pouvez utiliser QDialog pour obtenir des fonctions similaires, ou vous pouvez utiliser QWidget. QWidget lui-même n'a pas une telle fonction par défaut. Peut être réalisé, vous pouvez définir QWidget :: setWindowsFlags (this-> windowsFlags () | Qt :: Window ), vous pouvez avoir une telle fonction.

Après avoir défini l'indicateur Qt :: Window, la fenêtre a toujours pour fonction de rester en haut et est fonction d'une boîte de dialogue non modale. Donc, si la demande est la suivante, vous pouvez utiliser QDialog ou QWindow. Vous pouvez définir Qt :: Window. Vous n'avez pas besoin de définir la fenêtre pour qu'elle reste en haut. Des windowFlags similaires peuvent également implémenter des boîtes de dialogue non modales et une fenêtre en haut. Fonction. Bien sûr, si l'exigence est une boîte de dialogue modale, il est recommandé d'utiliser le QDialog prêt à l'emploi.

Si vous devez implémenter la fonction de boîte de dialogue modale, mais que l'effet de fenêtre est en effet non modal, vous pouvez utiliser QWidget, QWidget :: setWindowsFlags (this-> windowsFlags () | Qt :: Window ) , vous pouvez obtenir l'effet de fenêtre de la boîte de dialogue modale , Plus utiliser

     montrer();
     QEventLoop evtLoop;
     m_pEvtLoop = & evtLoop;
     evtLoop.exec ();

Ensuite, le bouton OK personnalisé de la fenêtre non modale qui apparaît peut être fait comme suit

void ColorDialog::okBtnClickedSlot()

{

    m_buttonRole = Yes;

    if (m_pEvtLoop != NULL)

    {

        m_pEvtLoop->exit();

    }

    this->hide();

}

 

void ColorDialog::cancelBtnClickedSlot()

{

    m_buttonRole = No;

    if (m_pEvtLoop != NULL)

    {

        m_pEvtLoop->exit();

    }

    this->hide();

}

 

   

 

 

确实可以使用QDialog实现模态和非模态对话框的功能,还有其他方法实现类似的功能吗,可以使用QWidget实现类似的效果吗,可以使用QWidget实现窗口置顶且为非模态对话框的功能,如果需求不要求是模态对话框,只需要窗口置顶和非模态窗口,可以使用QDialog实现类似的功能,也可以使用QWidget实现,QWidget本身默认是没有这样的功能的需要多做一些设置就可以实现了,可以设置QWidget::setWindowsFlags(this->windowsFlags() | Qt::Window),就可以有这样的功能。

设置了Qt::Window标志之后,窗口就具有一直置顶的功能,且为非模态对话框的功能。所以如果需求是这样的话,既可以使用QDialog实现,也可以使用QWindow实现,设置Qt::Window就可以了,不需要再设置窗口一直置顶等类似的windowFlags也可以实现非模态对话框且窗口置顶的功能。当然如果需求要求是模态对话框,建议还是用现成封装好的QDialog就可以了。

如果需要实现模态对话框功能,但是窗口效果确实非模态的,可以使用QWidget,QWidget::setWindowsFlags(this->windowsFlags() | Qt::Window),就可以实现模态对话框的窗口效果,再加上使用

     show();
     QEventLoop evtLoop;
     m_pEvtLoop = &evtLoop;
     evtLoop.exec();

然后再弹出的非模态窗口的自定义确定取消按钮做如下操作就可以了

void ColorDialog::okBtnClickedSlot()

{

    m_buttonRole = Yes;

    if (m_pEvtLoop != NULL)

    {

        m_pEvtLoop->exit();

    }

    this->hide();

}

 

void ColorDialog::cancelBtnClickedSlot()

{

    m_buttonRole = No;

    if (m_pEvtLoop != NULL)

    {

        m_pEvtLoop->exit();

    }

    this->hide();

}

发布了85 篇原创文章 · 获赞 18 · 访问量 12万+

Je suppose que tu aimes

Origine blog.csdn.net/a1317338022/article/details/105514311
conseillé
Classement