0

我有一个QDialog基础课程。

我有一个QEditLine *editLineQButton *button

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

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

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

如何解决我的问题?

4

3 回答 3

1

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

于 2012-10-17T08:21:55.710 回答
0

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

于 2012-10-18T06:37:54.427 回答
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);
    ......
}
于 2012-10-17T14:00:35.180 回答