Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.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
Qt-两个信号和模式对话框窗口_Qt_Signals_Modal Dialog_Slot - Fatal编程技术网

Qt-两个信号和模式对话框窗口

Qt-两个信号和模式对话框窗口,qt,signals,modal-dialog,slot,Qt,Signals,Modal Dialog,Slot,我有一个基于QDialog的类 我有一个QEditLine*编辑行和QButton*按钮 我使用按钮的clicked()信号。和编辑行的editingFinished()信号 当我更改编辑行中的文本并首先按下按钮时,editingFinished()信号被发出。在slot方法中,我调用QMessageBox::question()。 之后,我无法接收按钮的clicked()信号 我尝试将Qt::QueuedConnection用于connect方法,但没有帮助 如何解决我的问题?我认为问题在于消

我有一个基于
QDialog
的类

我有一个
QEditLine*编辑行
QButton*按钮

我使用按钮的
clicked()
信号。和编辑行的
editingFinished()
信号

当我更改编辑行中的文本并首先按下按钮时,
editingFinished()
信号被发出。在slot方法中,我调用
QMessageBox::question()
。 之后,我无法接收按钮的
clicked()
信号

我尝试将
Qt::QueuedConnection
用于connect方法,但没有帮助


如何解决我的问题?

我认为问题在于消息框的事件循环阻塞了主事件循环,因此按钮的信号不会发出。但是,如果打开了一个模式对话框,您打算如何单击按钮?

下面是代码:

Window::Window(QWidget *parent)
: QDialog(parent)
{
    setupUi(this);

    appPath = QApplication::applicationDirPath();

    connect(pButton, SIGNAL(clicked()), this, SLOT(build()), Qt::QueuedConnection);

    connect(pLineEdit, SIGNAL(editingFinished()), this, SLOT(pathChanged()), Qt::QueuedConnection);
}

void Window::pathChanged()
{
    QString path = pLineEdit->text();

    if(createPath(path))
        updatePath(path);
}

bool Window::createPath(QString path)
{
    if(!QDir(path).exists())
    {
        QMessageBox::StandardButton reply;
        reply = QMessageBox::question(this, tr("Folder is not exist"), "Folder " + path + " is not exist. Do you want to create it?", QMessageBox::Yes | QMessageBox::No);
        if (reply == QMessageBox::Yes)
        {
             QDir dir;
             dir.mkpath(path);
        }
    }
    return true;
}

class Window : public QDialog, public Ui::GLConverterDialogUI
{
    Q_OBJECT

public:
    Window(QWidget *parent = 0);
    ~Window(void);
    ......
}

我在另一个应用程序中遇到同样的问题。我使用一些图书馆。我猜这个库使用了QAbstractButton的pressed()信号,而不是clicked()。当我在按下按钮后调用
QFileDialog::getSaveFileName()
时,似乎也没有调用
mouseReleaseEvent()
。所以在关闭对话框后,按钮仍然被按下,我必须手动发送MouseButtonRealese事件。
也许我应该使用一些特殊参数调用dialog?

按钮看起来像是单击的。当模态对话框关闭时,它看起来仍然被按下。我想在模式对话框关闭后处理clicked()信号。所以,我应该以某种方式推迟发出clicked()信号,直到模态对话框关闭…或者我可以检查模态对话框关闭后按钮是否按下。但这很难看:(你能至少发布部分代码吗?我想说的是,在对话框关闭后,信号仍然应该发出。connect()是吗在连接按钮信号的地方调用,返回时没有错误?是否与
Qt::DirectConnection
的失败方式相同?由于对象位于主线程中,因此基本上不需要
Qt::QueuedConnection
。另一种方法是在Qt源中单击
的位置放置断点()
发出信号并查看它是如何调度的,因为我不确定它为什么会失败。是的,Qt::DirectConnection的行为是相同的。我将尝试使用clicked()播放。如果删除对消息框的调用,它会变得更好吗?因为没有第二个事件循环,我看不出还有什么会把事情搞砸。是的。我刚刚尝试了注释
reply=QMessageBox::question(…
,而是设置
reply=QMessageBox::Yes
。在这种情况下,
pathChanged()
build()
被调用。您可以尝试这个小示例来重现我的问题。当我有时间时,我将调试您的示例,不确定
mouseReleaseEvent()
在哪里消失。非常感谢!请看一下这个示例:这里我删除了editingFinished()信号。但问题是一样的。