0

私はQDialogベースクラスを持っています。

私は1つとを持っていQEditLine *editLineますQButton *button

clicked()ボタンの信号を使用します。そしてeditingFinished()editLineのシグナル。

editLineのテキストを変更してボタンを押すと、最初にeditingFinished()信号が出力されます。スロットメソッドでは、を呼び出しますQMessageBox::question()。その後clicked()、ボタンの信号を受信できなくなります。

connectメソッドを使っQt::QueuedConnectionてみましたが、うまくいきません。

私の問題を解決する方法は?

4

3 に答える 3

1

問題は、メッセージ ボックスのイベント ループがメイン イベント ループをブロックしているため、ボタンの信号が出力されないことだと思います。しかし、モーダル ダイアログを開いている場合、どのようにボタンをクリックする予定ですか?

于 2012-10-17T08:21:55.710 に答える
0

私は別のアプリケーションで同じ問題を抱えています。私はいくつかのライブラリを使用しています。このライブラリは、clicked() の代わりに QAbstractButton のpressed() シグナルを使用していると思います。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 に答える