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