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

时间:2012-10-17 08:00:47

标签: qt signals modal-dialog slot

我有一个基于QDialog的课程。

我有一个QEditLine *editLineQButton *button

我使用按钮的clicked()信号。和editLine的editingFinished()信号。

当我更改editLine中的文本并首先按下按钮时,会发出editingFinished()信号。在插槽方法中,我调用QMessageBox::question()。 之后,我无法收到按钮的clicked()信号。

我尝试将Qt::QueuedConnection用于连接方法,但它没有帮助。

如何解决我的问题?

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

以下是代码:

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);
    ......
}

答案 2 :(得分:0)

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