Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Qt и кроссплатформенное программирование С/С++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц, летом дешевле!

Ответ
 
Опции темы Поиск в этой теме
Старый 03.05.2023, 16:27   #11
erslgoeirjh
Форумчанин
 
Регистрация: 19.05.2009
Сообщений: 145
По умолчанию

Я написал:

1) класс Console:

Код:
class Console : public QPlainTextEdit
{
public:
    explicit  Console(QWidget *parent=nullptr);
    explicit  Console(const QString &text, QWidget *parent=nullptr);
    virtual  ~Console();
    void  output(QString s);
protected:
    void  mousePressEvent(QMouseEvent *);
    void  keyPressEvent(QKeyEvent *event);
    void  onEnter();
public:
    bool  isLocked;
};

void  Console::keyPressEvent(QKeyEvent *event)
{
    if (isLocked==true)
        return;
    if ((event->key()>=0x20)&&(event->key()<=0x7e)&&((event->modifiers()==Qt::NoModifier)||(event->modifiers()==Qt::ShiftModifier)))
        QPlainTextEdit:;keyPressEvent(event);
    if ((event->key==Qt::Key_Return)&&(event->modifiers()==Qt::NoModifier))
        onEnter();
}

void  Console::onEnter()
{
    textCursor().insertBlock();
    isLocked = true;
}

void  Console::output(QString s)
{
    textCursor().insertBlock();
    textCursor().insertText(s);
    isLocked = false;
}
2) класс ConsoleWindow--класс диалогового окна, который содержит на себе компонент plainTextEdit типа Console:

Код:
void  ConsoleWindow::print(char* s)
{
    QString  myString;

    myString = QString(s);
    ui->plainTextEdit->output(myString);
}

void  ConsoleWindow::getstr(char *s)
{
    string  stdstr;
    QString  myString;

    isEntered = false;
    while (isEntered==false)
    {
        if (ui->plainTextEdit->isLocked==true)
                                        isEntered = true;
    }
    QTextCursor  textCursor = ui->plainTextEdit->textCursor();
    QTextBlock  textBlock = textCursor.block();
    myString = textBlock.text();
    stdstr = myString.toStdString();
    strcpy(s,stdstr.c_str());
}
3) в классе MainWindow, соответствующему главному диалоговому окну приложения:

Код:
void  MainWindow::on_pushButton_clicked()
{
    char  s[80], s1[80], s2[80], s3[80], s4[80];
    double  val1, val2, val3;

    ConsoleWindow *consoleWindow = new ConsoleWindow(this);
    consoleWindow->mainWindow = this;
    consoleWindow->show();
    strcpy(s,"Введите первое вещественное число: \n");
    consoleWindow->print(s);
    consoleWindow->getstr(s1);
    // ...    
}
В результате чего при отладке программы действия с выводом и вводом данных в ConsoleWindow "зависают"--само окно ConsoleWindow с компонентом plainTextEdit выводится, то там не отображается строка "Введите первое вещественное число" и нет ожидания ввода последующей строки. В чём причина этого? Можно ли как-то сделать так, чтобы заработало ожидание ввода строки из plainTextEdit и сам этот ввод?
erslgoeirjh вне форума Ответить с цитированием
Старый 03.05.2023, 16:27   #12
erslgoeirjh
Форумчанин
 
Регистрация: 19.05.2009
Сообщений: 145
По умолчанию

Я написал:

1) класс Console:

Код:
class Console : public QPlainTextEdit
{
public:
    explicit  Console(QWidget *parent=nullptr);
    explicit  Console(const QString &text, QWidget *parent=nullptr);
    virtual  ~Console();
    void  output(QString s);
protected:
    void  mousePressEvent(QMouseEvent *);
    void  keyPressEvent(QKeyEvent *event);
    void  onEnter();
public:
    bool  isLocked;
};

void  Console::keyPressEvent(QKeyEvent *event)
{
    if (isLocked==true)
        return;
    if ((event->key()>=0x20)&&(event->key()<=0x7e)&&((event->modifiers()==Qt::NoModifier)||(event->modifiers()==Qt::ShiftModifier)))
        QPlainTextEdit:;keyPressEvent(event);
    if ((event->key==Qt::Key_Return)&&(event->modifiers()==Qt::NoModifier))
        onEnter();
}

void  Console::onEnter()
{
    textCursor().insertBlock();
    isLocked = true;
}

void  Console::output(QString s)
{
    textCursor().insertBlock();
    textCursor().insertText(s);
    isLocked = false;
}
2) класс ConsoleWindow--класс диалогового окна, который содержит на себе компонент plainTextEdit типа Console:

Код:
void  ConsoleWindow::print(char* s)
{
    QString  myString;

    myString = QString(s);
    ui->plainTextEdit->output(myString);
}

void  ConsoleWindow::getstr(char *s)
{
    string  stdstr;
    QString  myString;

    isEntered = false;
    while (isEntered==false)
    {
        if (ui->plainTextEdit->isLocked==true)
                                        isEntered = true;
    }
    QTextCursor  textCursor = ui->plainTextEdit->textCursor();
    QTextBlock  textBlock = textCursor.block();
    myString = textBlock.text();
    stdstr = myString.toStdString();
    strcpy(s,stdstr.c_str());
}
3) в классе MainWindow, соответствующему главному диалоговому окну приложения:

Код:
void  MainWindow::on_pushButton_clicked()
{
    char  s[80], s1[80], s2[80], s3[80], s4[80];
    double  val1, val2, val3;

    ConsoleWindow *consoleWindow = new ConsoleWindow(this);
    consoleWindow->mainWindow = this;
    consoleWindow->show();
    strcpy(s,"Введите первое вещественное число: \n");
    consoleWindow->print(s);
    consoleWindow->getstr(s1);
    // ...    
}
В результате чего при отладке программы действия с выводом и вводом данных в ConsoleWindow "зависают"--само окно ConsoleWindow с компонентом plainTextEdit выводится, то там не отображается строка "Введите первое вещественное число" и нет ожидания ввода последующей строки. В чём причина этого? Можно ли как-то сделать так, чтобы заработало ожидание ввода строки из plainTextEdit и сам этот ввод?
erslgoeirjh вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц, летом дешевле!

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Эмуляция нажатия ЛКМ в приложении под мышкой Illusiony Общие вопросы Delphi 4 09.05.2014 16:37
Настройка консольного окна RobSys Операционные системы общие вопросы 2 14.03.2011 23:02
Оформление консольного окна. Smitt64 Visual C++ 3 11.03.2011 16:14
Отмена закрытия консольного окна после завершения работы приложения FeloS Общие вопросы C/C++ 21 25.02.2011 16:34
Эмуляция нажатия клавиши в любом активном приложении Marsel737 Общие вопросы Delphi 1 19.03.2010 14:44