Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
QTextEdit和光标交互_Qt_Qtextedit - Fatal编程技术网

QTextEdit和光标交互

QTextEdit和光标交互,qt,qtextedit,Qt,Qtextedit,我正在修改Qt5终端示例,并将QTextEdit窗口用作终端控制台。我遇到了几个问题 Qt对传入字符串中的回车('\r')进行了奇怪的解释。通常,efter 3-7发送时,它将('\r')解释为新行('\n'),这是最烦人的。当我最终发现时,我选择从传入数据中过滤掉所有'\r'。 这种行为是由于某种环境造成的吗 让光标交互正常工作有点问题。我希望控制台通过复选框选择autoscroll。我还希望它能够在控制台运行时选择文本,而不会在新数据到来时丢失选择 这是我当前的prinout函数,它是一个插

我正在修改Qt5终端示例,并将QTextEdit窗口用作终端控制台。我遇到了几个问题

  • Qt对传入字符串中的回车('\r')进行了奇怪的解释。通常,efter 3-7发送时,它将('\r')解释为新行('\n'),这是最烦人的。当我最终发现时,我选择从传入数据中过滤掉所有'\r'。 这种行为是由于某种环境造成的吗

  • 让光标交互正常工作有点问题。我希望控制台通过复选框选择autoscroll。我还希望它能够在控制台运行时选择文本,而不会在新数据到来时丢失选择

  • 这是我当前的prinout函数,它是一个插槽,连接到任何数据到达后发出的信号:

     void MainWindow::printSerialString(QString& toPrint)
     {
        static int cursPos=0;
    
        //Set the cursorpos to the position from last printout
        QTextCursor c = ui->textEdit_console->textCursor();
        c.setPosition(cursPos);
        ui->textEdit_console->setTextCursor( c );
    
        ui->textEdit_console->insertPlainText(toPrint);
        qDebug()<<"Cursor: " << ui->textEdit_console->textCursor().position();
    
        //Save the old cursorposition, so the user doesn't change it
        cursPos= ui->textEdit_console->textCursor().position();
    
        toPrint.clear();
     }
    
    void主窗口::printSerialString(QString&toPrint)
    {
    静态int-cursPos=0;
    //将光标设置为上次打印输出的位置
    QTextCursor c=ui->textEdit_控制台->textCursor();
    c、 设置位置(cursPos);
    用户界面->文本编辑\控制台->设置文本光标(c);
    用户界面->文本编辑\控制台->插入纯文本(toPrint);
    
    qDebug()通常,对功能丰富的终端小部件使用
    QTextEdit
    似乎不是一个好主意。您需要正确处理转义序列,例如光标移动和颜色模式设置,以某种方式将编辑粘贴到当前终端“页面”的左上角更好的解决方案可能是继承
    QScrollArea
    并自己实现所有需要的绘制-选择滚动功能

    作为一些问题的临时解决方法,我建议使用
    ui->textEdit\u控制台->append(toPrint)
    而不是
    insertPlainText(toPrint)


    要自动滚动编辑,您可以使用
    QTextEdit::moveCursor()
    将光标移动到末尾,然后调用
    QTextEdit::EncursorVisible()

    我为SWI Prolog制作了一个基于QTextEdit的终端,具有一些功能,如ANSI着色序列(子集)解码,命令历史管理,多个插入点,完成,提示

    它运行一个非阻塞用户界面,同时提供模式REPL(Read/Eval/Print/Loop),这是解释语言(如Prolog)最常见的界面

    代码由于线程问题而变得复杂(根据用户请求,可能有多个控制台,或者多个线程在主控制台上交互),但核心代码非常简单。我只跟踪插入点,并允许光标四处移动,在输出区域禁用编辑

    pqConsole它是一个共享对象(我喜欢这种代码重用),但是对于部署来说,一个独立的程序更方便

    在这里,一些选定的代码段中,用于控制输出的状态变量是promptPosition和fixedPosition

    你可以看到键盘管理是最复杂的

    /** \brief send text to output
     *
     *  Decode ANSI terminal sequences, to output coloured text.
     *  Colours encoding are (approx) derived from swipl console.
     */
    void ConsoleEdit::user_output(QString text) {
    
    #if defined(Q_OS_WIN)
        text.replace("\r\n", "\n");
    #endif
    
        QTextCursor c = textCursor();
        if (status == wait_input)
            c.setPosition(promptPosition);
        else {
            promptPosition = c.position();  // save for later
            c.movePosition(QTextCursor::End);
        }
    
        auto instext = [&](QString text) {
            c.insertText(text, output_text_fmt);
            // Jan requested extension: put messages *above* the prompt location
            if (status == wait_input) {
                int ltext = text.length();
                promptPosition += ltext;
                fixedPosition += ltext;
                ensureCursorVisible();
            }
        };
    
    // filter and apply (some) ANSI sequence
    int pos = text.indexOf('\x1B');
    if (pos >= 0) {
        int left = 0;
    ...
    
            instext(text.mid(pos));
        }
        else
            instext(text);
    
        linkto_message_source();
    }
    

    我认为您不应该使用静态变量(就像代码中出现的那样),而应该依赖QTextCursor接口和一些状态变量,就像我一样。

    回答得好!有效地使用replace()当摆脱回车时。这是一个常见的问题吗?在深入研究它之前,是否确定了打印内容的位置(用户不能直接控制)并提示了用户可以更改的位置?@user305025:1)我在Linux中开发的,当移植到Windows时,即(mini)简单的#ifdef.2)fixedPosition保留最后一个用户可编辑的位置,即输出后插入符号的位置,随后引入promptPosition,以允许异步进程的输出而不干扰模式对话框。净效果很难用语言解释,在发出任何命令时都很明显t从后台引擎生成输出,如。。。
    /** \brief send text to output
     *
     *  Decode ANSI terminal sequences, to output coloured text.
     *  Colours encoding are (approx) derived from swipl console.
     */
    void ConsoleEdit::user_output(QString text) {
    
    #if defined(Q_OS_WIN)
        text.replace("\r\n", "\n");
    #endif
    
        QTextCursor c = textCursor();
        if (status == wait_input)
            c.setPosition(promptPosition);
        else {
            promptPosition = c.position();  // save for later
            c.movePosition(QTextCursor::End);
        }
    
        auto instext = [&](QString text) {
            c.insertText(text, output_text_fmt);
            // Jan requested extension: put messages *above* the prompt location
            if (status == wait_input) {
                int ltext = text.length();
                promptPosition += ltext;
                fixedPosition += ltext;
                ensureCursorVisible();
            }
        };
    
    // filter and apply (some) ANSI sequence
    int pos = text.indexOf('\x1B');
    if (pos >= 0) {
        int left = 0;
    ...
    
            instext(text.mid(pos));
        }
        else
            instext(text);
    
        linkto_message_source();
    }