我有几个模态对话框和主对话框,其中有exec()模态。我怎么知道主窗口是否被模态遮挡了?
我通过派生类体验过这一点,但它与QDialog基类相同:
当我做
QDialog dialog();
dialog.exec();
Run Code Online (Sandbox Code Playgroud)
编译器抱怨
J:\...\mainwindow.cpp:-1: In member function 'void MainWindow::on_viewButton_pressed()':
J:\...\mainwindow.cpp:72: Fehler:request for member 'exec' in 'dialog', which is of non-class type 'QDialog()'
Run Code Online (Sandbox Code Playgroud)
这与使用的构造函数有关,因为当我这样做时
QDialog dialog(0);
dialog.exec();
Run Code Online (Sandbox Code Playgroud)
代码编译没有错误.这也有效:
QDialog *dial = new QDialog();
dial->exec();
Run Code Online (Sandbox Code Playgroud)
所以.是因为一个显式的构造函数?
文档称其定义为
QDialog::QDialog ( QWidget * parent = 0, Qt::WindowFlags f = 0 )
Run Code Online (Sandbox Code Playgroud)
那么前两个例子不应该完全一样吗?为什么编译器会抱怨第二行,而不是构造函数.
感谢您的启发,非常欢迎进一步阅读该主题的提示
我有以下代码:
void Processmethod()
{
QDialog *ProcessMessage = new QDialog;
Ui::DialogProcessMessage Dialog;
Dialog.setupUi(ProcessMessage);
ProcessMessage->setModal(true);
ProcessMessage->setAttribute(Qt::WA_DeleteOnClose);
ProcessMessage->show();
qApp->processEvents();
processmethodONE();
processmethodTWO();
processmethodTHREE();
}
void processmethodONE()
{
QString ProcessCommand = "w8 " + blablubli";
Prozess.setWorkingDirectory(Path); //QProcess "Prozess" is globaly defined
Prozess.setStandardOutputFile(Path); //in my class
QThread* thread = new QThread;
Prozess.moveToThread(thread);
Prozess.start(ProcessCommand);
while(!Prozess.waitForFinished(2000))
{
std::cerr << "Process running " << std::endl;
}
QProcess::ExitStatus Status = Prozess.exitStatus();
if (Status == 0)
{
std::cout << "File created!" << std::endl;
}
}
Run Code Online (Sandbox Code Playgroud)
在此源代码中,我尝试在某些进程启动之前打开一个弹出对话框。问题是对话框不可点击,但在对话框上我想创建一个按钮来中止正在运行的方法。如您所见,我尝试使用 QThread 在另一个线程中运行进程,但仍然无法单击该对话框。此外,如果我使用“application/x-executable”文件打开我的应用程序(GUI),则在激活上述方法时会丢失对话框内容。我该如何解决这些问题?我哪里错了?你好
我有一堆图像,我想在其上执行一些操作.处理完每个图像后,我的程序会弹出一个对话框,提示用户是否要继续下一个图像或中止.在此之前,他们应该有机会对图像或参数进行一些手动更改.无论如何,他们必须能够访问应用程序的窗口,同时应该阻止执行调用对话框的方法,直到关闭对话框.
我尝试使用QMessageBox解决这个问题,但如果我通过exec()打开它,它会阻止整个应用程序,如果我使用show(),程序的执行将继续,而不会等待用户的反应.
有没有一种方便的方法来阻止调用方法或函数与对话框,但允许用户与其他窗口进行交互?
提前感谢任何提示.
我有一个QDialog,我读了很多关于show(),exec()和open()的差异.不幸的是,我从来没有找到一个解决方案来改变运行时对话框的模态.我有一个应用程序,从那里我的QDialog启动.我在这个对话框中有一个切换按钮,点击它,QDialog应该改变模态,这样就可以与应用程序进行交互 - 但这不应该一直发生 - 只要选中切换按钮.
有可能吗?我无法解决设置setModal(true/false)的问题,这只是允许我启动它模态,切换按钮并将其设置为非模态,但后来我不能回到模态.
这里有一些代码:
启动对话框:
从主窗口:
_dialog = new ToggleModalDialog(this, id, this);
_dialog->setWindowModality(Qt::ApplicationModal);
_dialog->open();
Run Code Online (Sandbox Code Playgroud)
这里是ToggleModalDialog中的切换槽
void ToggleModalDialog::changeModality(bool checkState)
{
if(checkState)
{
this->setWindowModality(Qt::NonModal);
ui->changeModalityButton->setChecked(true);
this->setModal(false);
}
else
{
this->setWindowModality(Qt::ApplicationModal);
ui->changeModalityButton->setChecked(true);
}
Run Code Online (Sandbox Code Playgroud)
提前致谢!
当我运行以下函数时,对话框显示所有内容。问题是按钮无法连接。OK 和 Cancel 不响应鼠标点击。
void MainWindow::initializeBOX(){
QDialog dlg;
QVBoxLayout la(&dlg);
QLineEdit ed;
la.addWidget(&ed);
//QDialogButtonBox bb(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
//btnbox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept()));
connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject()));
la.addWidget(buttonBox);
dlg.setLayout(&la);
if(dlg.exec() == QDialog::Accepted)
{
mTabWidget->setTabText(0, ed.text());
}
}
Run Code Online (Sandbox Code Playgroud)
在运行时,cmd 中的错误显示:没有像 accept() 和 reject() 这样的插槽。
网络上充斥着类似的问题,但是对于我来说,没有什么适合解决当前问题的方法。
在我的QT-C ++应用程序中,我有一个带有某些功能的主窗口形式,有一个QPushButton,按此按钮可以打开QDialog。现在,表单中的所有功能都可以正常工作,但是我希望最终的应用程序没有任何顶部标题栏。即没有关闭/最小化/最大化按钮。
在我的main.cpp文件中,
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.setWindowFlags(Qt::Window | Qt::FramelessWindowHint);
w.show();
return a.exec();
}
Run Code Online (Sandbox Code Playgroud)
结果,主窗口变为-

对于dialog.cpp窗口,我设置了-
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
//QDialog Dialog(0, Qt::CustomizeWindowHint|Qt::WindowTitleHint); --- used this also; no use
QDialog Dialog(0, Qt::FramelessWindowHint | Qt::Dialog);
Run Code Online (Sandbox Code Playgroud)
但是QDialog的标题栏仍然保留,看起来像-

我要去哪里错了?关于如何删除关闭按钮和标题栏的任何想法?
我有非常具体的情况.我想QAction进入QToolbar并达到以下行为:
QAction可用图标查看.QDialog应该出现在屏幕上而不是QMenu像一个Now I'm a bit confused with implementing all this things together.
For now I've created QAction added it to toolbar and also created an empty QMenubecause I didn't get the idea of how to add the "dropdown" arrow another way.
So, I also connected my slot to QMenu aboutToShow() signal and now, I can create my dialog and exec() it just before QMenu shows. But here's …
我使用QT Designer并使用它创建我的GUI。要启动主程序,我使用以下代码:
import sys
from PyQt4 import uic, QtGui, QtCore
from PyQt4.QtGui import *
from PyQt4.QtCore import *
try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
def _fromUtf8(s):
return s
try:
_encoding = QtGui.QApplication.UnicodeUTF8
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig)
def main():
app = QtGui.QApplication(sys.argv)
myWindow = MyWindowClass()
myWindow.show()
app.exec_()
main_dialog = uic.loadUiType("GUI.ui")[0]
class MyWindowClass(QtGui.QMainWindow, main_dialog):
def __init__(self, parent=None):
QtGui.QMainWindow.__init__(self, parent)
self.setupUi(self)
if __name__ == "__main__":
main()
Run Code Online (Sandbox Code Playgroud)
因此,在这一行中,main_dialog …
我需要创建一个带有圆角半透明角的QDialog 。问题是这样做时,角是半透明的,但以某种方式被窗口的 alpha 属性填充,使其变黑(这是我对问题原因的理解)
清晰可见的是圆形边缘,但有某种黑色的“背景”。QThread确认一下,此对话框是由from启动的模式对话框QMainWindow。它不是父窗口。
QDialog(根)组件的 CSS是:
QDialog {
background-color: rgba(250, 250, 250, 255);
border-radius: 30px;
color: #3C3C3C;
}
Run Code Online (Sandbox Code Playgroud)
组件布局如下所示
我也添加了阴影效果QDialog。这是构造函数代码QDialog:
UpdateDialog::UpdateDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::UpdateDialog)
{
ui->setupUi(this);
setWindowFlags(Qt::FramelessWindowHint | Qt::Dialog);
QGraphicsDropShadowEffect* effect = new QGraphicsDropShadowEffect();
effect->setBlurRadius(5);
this->setGraphicsEffect(effect);
}
Run Code Online (Sandbox Code Playgroud)
值得注意的是,父级QMainWindow在其构造函数中设置了以下属性
ui->setupUi(this);
statusBar()->hide();
setWindowFlags(Qt::FramelessWindowHint);
setAttribute(Qt::WA_TranslucentBackground, true);
// Set rounded corners style
setStyleSheet("QMainWindow {\n background-color:rgba(240,240,240,255);\n border-radius: 30px;\n}\n\nQDialog {\n border-radius: 30px;\n}");
// Add shadow to main window …Run Code Online (Sandbox Code Playgroud) qdialog ×10
qt ×8
c++ ×6
modal-dialog ×2
constructor ×1
explicit ×1
modality ×1
pyqt4 ×1
python ×1
python-2.7 ×1
qmenu ×1
qmessagebox ×1
qprocess ×1
qt-designer ×1
qt4 ×1
qthread ×1
qwidget ×1