QDialog не принимает ввод текста, если модальный - PullRequest
0 голосов
/ 02 февраля 2010

Странная ошибка с диалогом Qt (Qt4.6 / windows)

Если диалог запускается из MainWindow (с панели инструментов / или действия меню), и он является модальным, ни одно из текстовых полей не примет никаких изменений. Другие элементы управления (выпадающий, кнопки и т. Д.) Все работают.

Если я сделаю диалог немодальным, с show (), а не exec (), он отлично работает!

Кто-нибудь сталкивался с чем-нибудь подобным?

пример кода:

#include "ui_testDlg.h"    
class TestDlg : public QDialog, public Ui::TestDlg
{
    Q_OBJECT;    
public:
    TestDlg(QWidget *parent=0)  {
        setupUi(this);
    }

    ~TestDlg(void) {}    

private:
    Ui::TestDlg ui;     
};

TestDlg.ui - это просто простейшее диалоговое окно + элемент управления lineEdit, созданный в QDesigner.

void MainWindow::onTest()
{
TestDlg *test = new TestDlg(this);
test->show();  // works
//or    
test->exec();  // opens dlg but can't type in it!
}

РЕДАКТИРОВАТЬ: Это та же проблема, если я просто использую QInputWidget - и это только проблема в MainWindow. Так должен ли быть какой-то сигнал, который я блокирую / потребляю?

Ответы [ 2 ]

1 голос
/ 02 февраля 2010

Вы можете изменить отношение между TestDlg и Ui :: TestDlg с подклассов на закрытый член.

#include "ui_testdlg.h"

class TestDlg: public QDialog {
    Q_OBJECT
public:
    TestDlg(QWidget *parent = 0) : QDialog(parent), ui(new Ui::TestDlg)
    {
        ui->setupUi(this);
    }
   ~TestDlg()
    {
        delete ui;
    }

private:
    Ui::TestDlg*ui;
};

QtCreator по умолчанию использует новые классы виджетов, подобные этой, и с этой настройкой у меня не было проблем с QLineEdit. (Qt 4.6 на WinXP)

0 голосов
/ 29 декабря 2012

У меня просто была такая же проблема. Я нашел решение для своего случая, но я не уверен, что оно пригодится и для вашего случая.

Так что в основном я пытаюсь создать диалог входа в систему. Прежде чем я покажу главное окно, я сначала покажу диалог входа в систему. если войти не удалось, я просто выйду из программы.

Мой код выглядит так:

MainWindow w;
LoginDialog loginDialog;
loginDialog.exec();
w.init();
w.showApp();

Когда появляется диалог входа в систему, строка редактирования на нем не может принимать любой ввод текста.

но если я реорганизую код следующим образом:

LoginDialog loginDialog;
loginDialog.exec();
MainWindow w;
w.init();
w.showApp();

LineEdit теперь может работать. Я предполагаю, что что-то внутри конструктора главного окна испортило цикл событий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...