Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何让模式对话框阻止一个小部件而不是所有小部件?_C++_Qt_Modal Dialog - Fatal编程技术网

C++ 如何让模式对话框阻止一个小部件而不是所有小部件?

C++ 如何让模式对话框阻止一个小部件而不是所有小部件?,c++,qt,modal-dialog,C++,Qt,Modal Dialog,我有一个QWidget,它有一个垂直布局,由一个QWebView和一个VirtualKeyboard小部件组成。我有一个插槽连接到从webView检索的networkaccessmanager的authenticationRequired信号。 在这个插槽中,如果需要身份验证,我将打开一个模式对话框来检索用户凭据。 但这不仅会阻止webView,还会阻止VirtualKeyboard。我读过关于SetWindowModal(Qt::WindowModal)的文章,但这没有帮助。甚至可以在一个小部

我有一个QWidget,它有一个垂直布局,由一个QWebView和一个VirtualKeyboard小部件组成。我有一个插槽连接到从webView检索的networkaccessmanager的authenticationRequired信号。 在这个插槽中,如果需要身份验证,我将打开一个模式对话框来检索用户凭据。 但这不仅会阻止webView,还会阻止VirtualKeyboard。我读过关于SetWindowModal(Qt::WindowModal)的文章,但这没有帮助。甚至可以在一个小部件上设置一个对话框块,但不能在另一个小部件上设置对话框块吗

Panel类中的构造函数和插槽
我对Qt的了解还不够,不知道Qt是否有一些特殊功能可以让您通过“模态”对话框实现这一点,但一般来说,一旦您需要任何非模态行为,模态就没有用处了。在这种情况下,您必须实现一个无模式对话框,并在您自己的代码中管理其他小部件的“已启用”状态。键盘和webview是同一窗口的子窗口吗?模态将只在窗口级别工作,而不是在我看到的themAh内部的单独小部件上。两个小部件都是同一窗口的子窗口。因此,我想我必须尝试其他方法。从Qt Docs for windows模态标志Qt::WindowModal:窗口是模态的,它是单个窗口层次结构,并阻止输入到其父窗口、所有祖父母窗口以及其父窗口和祖父母窗口的所有兄弟窗口。因此,您需要尝试将键盘放在另一个windows层次结构中,或者不在其他windows的兄弟姐妹、父母或祖父母中。
Panel::Panel(QWidget *parent) : QWidget(parent)
{
  verticalLayout = new QVBoxLayout(this);
  verticalLayout->setContentsMargins(0, 0, 0, 0);

  QNetworkProxyFactory::setUseSystemConfiguration(true);

  webView = new QWebView(this);
  //webView->setContextMenuPolicy(Qt::CustomContextMenu);
  webView->setLocale(QLocale::English);
  //webView->load(*url);
  webView->settings()->setAttribute(QWebSettings::JavascriptEnabled, true);
  webView->settings()->setAttribute(QWebSettings::JavascriptCanOpenWindows,true);
  keyboard = new QVirtualKeyboard(this);
  keyboard->setKeyboardLayout(0);
  keyboard->setMaximumHeight(100);
  keyboard->show();

  verticalLayout->addWidget(webView);
  verticalLayout->addWidget(keyboard);

  connect(webView->page()->networkAccessManager(), SIGNAL(authenticationRequired(QNetworkReply*,QAuthenticator*)),this,SLOT(handleAuthenticationRequired(QNetworkReply*,QAuthenticator*)));
}

void Panel::handleAuthenticationRequired(QNetworkReply* reply,QAuthenticator* authenticator)
{
    LoginDialog *log = new LoginDialog(this);

    connect(log, SIGNAL(acceptLogin(QString&,QString&,int&)),this,SLOT(slotAcceptUserLogin(QString&,QString&)));
    log->show();
    //delete log;

    authenticator->setUser(username);
    authenticator->setPassword(password);

    qDebug() << reply->readAll();
    webView->reload();
}
LoginDialog::LoginDialog(QWidget *parent) :
    QDialog(parent)
{
    setUpGUI();
    setWindowTitle( tr("User Login") );
    //setModal( true );
    setWindowModality(Qt::WindowModal);
}