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

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

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

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

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

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

Я написал:

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
Сообщений: 153
По умолчанию

Я написал:

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 вне форума Ответить с цитированием
Старый 07.06.2023, 16:38   #13
erslgoeirjh
Форумчанин
 
Регистрация: 19.05.2009
Сообщений: 153
По умолчанию

Ура, заработало!

Код:

1) файл console.h :

Код:
#include <QObject>
#include <QPlainTextEdit>
 
class Console : public QPlainTextEdit
{
    Q_OBJECT
    public:
    explicit  Console(QWidget *parent=nullptr);
    explicit  Console(const QString &text, QWidget *parent=nullptr);
    virtual  ~Console();
    void  output(QString s);
    void  sendSignal();
    protected:
    void  mousePressEvent(QMouseEvent *);
    void  keyPressEvent(QKeyPressEvent *event);
    signals:
    void  lineEntered();
};
2) в файле console.cpp :

Код:
void  Console::keyPressEvent(QKeyEvent *event)
{
    if ((event->key()>=0x20)&&(event->key()<=0x7e)&&((event->modifiers()==Qt::NoModifier)||(event->modifiers()==Qt::ShiftModifier)))
        QPlainTextEdit::keyPressEvent(event);
    if (((event->key()==Qt::Key_Backspace)||(event->key()==Qt::Key_Left)||(event->key()==Qt::Key_Right))&&(event->modifiers()==Qt::NoModifier))
        QPlainTextEdit::keyPressEvent(event);
    if ((event->key()==Qt::Return)&&(event->modifiers()==Qt::NoModifier))
    {
        sendSignal();
        QPlaintTextEdit::keyPressEvent(event);
    }   
}
 
void  Console::output(QString s)
{
    appendPlainText(s);
}
 
void  Console::sendSignal()
{
    emit  lineEntered();
}
3) файл consolewindow.h :

Код:
#include <QDialog>
#include "mainwindow.h"
#include "ui_mainwindow.h"
 
namespace  Ui {
    class  ConsoleWindow;
}
 
class ConsoleWindow : public QDialog
{
    Q_OBJECT
    public:
    explicit  ConsoleWindow(QWidget *parent=nullptr);
    ~ConsoleWIndow();
    private slots:
    void  on_pushButton_2_clicked();
    public slots:
    void  onEnter();
    private:
    Ui::ConsoleWIndow *ui;
    public:
    void  print(char* s);
    void  getstr(char* s);
    int  curlength;
    char  mystr[80];
    MainWindow *mainWindow;
    QEventLoop  loop;
};
4) в файле consolewindow.cpp :

Код:
void  ConsoleWindow::print(char* s)
{
    QString  myString;
 
    myString = QString(s);
    ui->plainTextEdit->output(myString);
}
 
void  ConsoleWindow::getstr(char *s)
{
    int  index, length;
    string  stdstr;
    QString  myString;
 
    connect(ui->plainTextEdit,SIGNAL(lineEntered()),this,SLOT(onEnter()));
    loop.exec();
    myString = ui->plainTextEdit->toPlainText();
    length = myString.length();
    myString = myString.left(length-1);
    index = myString.lastIndexOf('\n');
    myString = myString.right(length-index-2);
    stdstr = myString.toStdString();
    strcpy(s,stdstr.c_str());
    disconnect(ui->plainTextEdit,SIGNAL(lineEntered()),this,SLOT(onEnter()));    
}
 
void  ConsoleWindow::onEnter()
{
    loop.exit();
}
5) в файле mainwindow.cpp :

Код:
void  MainWindow::on_pushButton_clicked()
// если была нажата кнопка "Тестировать"
{
    char  s[80], s1[80], s2[80], s3[80], s4[80], sanswer[10];
    double  val1, val2, val3;
 
    ConsoleWindow *consoleWindow = new ConsoleWIndow(this);
    consoleWindow->mainWindow = this;
    consoleWindow->show();
    metka: ;
    strcpy(s,"Введите первое вещественное число:\n");
    consoleWindow->print(s);
    consoleWindow->getstr(s1);
    strcpy(s,"Введите второе вещественное число:\n");
    consoleWindow->print(s);
    consoleWindow->getstr(s2);
    val1 = atof(s1);
    val2 = atof(s2);
    val3 = val1 + val2;
    sprintf(s3,"%f",val3);
    sprintf(s4,"Сумма введённых двух чисел равна: ");
    strcat(s4,s3);
    consoleWindow->print(s4);
    strcpy(s,"Будете ещё работать (y/n)?\n");
    consoleWindow->print(s);
    consoleWIndow->getstr(sanswer);
    if (((strcmp(sanswer,"y")==0)||(strcmp(sanswer,"Y")==0)))
        goto metka;
    consoleWindow->close();
}
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