Qt setWindowFlags(Qt :: Window)関数コードは非モーダルウィンドウを解析し、ウィンドウの上部に表示します

モーダルウィンドウと非モーダルウィンドウをサポートするウィンドウが必要な場合は、通常、ウィンドウをQDailogに変更する必要があります。

この機能を実現するための重要なポイントは、setStyleSheet(Qt :: Window)を設定することです。ソースコードは次のとおりです。

        ウィジェット= 0x00000000、

        ウィンドウ= 0x00000001、

        ダイアログ = 0x00000002 | ウィンドウ

 

モーダルウィンドウと非モーダルウィンドウをサポートするウィンドウが必要な場合は、通常、ウィンドウをQDailogに変更する必要があります。

この機能を実現するための重要なポイントは、setStyleSheet(Qt :: Window)を設定することです。ソースコードは次のとおりです。

        ウィジェット= 0x00000000、

        ウィンドウ= 0x00000001、

        ダイアログ = 0x00000002 | ウィンドウ

 

Qt :: Dialog

0x00000002 |

ウィジェットがダイアログとして装飾する必要があるウィンドウであることを示します(つまり、通常、タイトルバーの最大化ボタンや最小化ボタンはありません)。これはQDialogのデフォルトのタイプですこれをモーダルダイアログとして使用する場合は、別のウィンドウから起動するか、親を持ち、QWidget :: windowModalityプロパティで使用する必要があります。モーダルにすると、ダイアログによって、アプリケーションの他のトップレベルウィンドウが入力を取得できなくなります。親を持つセカンダリウィンドウとしてトップレベルウィンドウを参照します。

 

 

QDialogを使用してモーダルダイアログボックスと非モーダルダイアログボックスの機能を実現できますか?同様の機能を実現する他の方法はありますか?QWidgetを使用して同様の効果を実現できますか?QWidgetを使用してウィンドウ上部と非モーダルダイアログボックスの機能を実現できますか? 、要件がモーダルダイアログボックスを必要としない場合は、ウィンドウの上部と非モーダルウィンドウのみが必要です。QDialogを使用して同様の機能を実現するか、QWidgetを使用できます。QWidget自体には、デフォルトではそのような機能はありません。達成することができ、QWidget :: setWindowsFlags(this-> windowsFlags()| Qt :: Window を設定できます。このような関数を使用できます。

Qt ::ウィンドウフラグを設定すると、ウィンドウは常に上部に固定される機能を持ち、非モーダルダイアログボックスの機能になります。したがって、このような需要がある場合は、QDialogまたはQWindowを使用できます。Qt:: Windowを設定できます。ウィンドウを最前面に表示するように設定する必要はありません。同様のwindowFlagsは、非モーダルダイアログとウィンドウを最前面に実装することもできます。機能。もちろん、要件がモーダルダイアログボックスである場合は、既成のパッケージ化されたQDialogを使用することをお勧めします。

モーダルダイアログボックス関数を実装する必要があるが、ウィンドウ効果が実際に非モーダルである場合、QWidget、QWidget :: setWindowsFlags(this-> windowsFlags()| Qt :: Window を使用すると、モーダルダイアログのウィンドウ効果を実現できます。 、プラス使用

     公演();
     QEventLoop evtLoop;
     m_pEvtLoop =&evtLoop;
     evtLoop.exec();

次に、ポップアップする非モーダルウィンドウのカスタムOKボタンを次のように実行できます。

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万+

おすすめ

転載: blog.csdn.net/a1317338022/article/details/105514311