综述

最近在写一个文件系统。
基础架构写了一段时间了,基本差不多了。还需要用QT做一个shell交互程序界面。参考mac和linux以及windows的shell,都是一个text框中进行操作的。而且
在这一个text中只有最下一行可以输入
问题来了:


如何qtextedit怎么设置部分文字只读?

思路:

跟踪我们的:光标!如果光标的位置改变(不是最下一行)那么将text设置为只读(setReadOnly(true));否则(setReadOnly(false));
下面关键是如何跟踪呢?

使用信号槽机制。

connect( myTextEdit, SIGNAL(cursorPositionChanged()), SLOT(on_textEdit_cursorPositionChanged()) );

这里的cursorPositionChanged()系统已经有了。而
on_textEdit_cursorPositionChanged()
需要自写:
在widget下写好该函数:

void Widget::on_textEdit_cursorPositionChanged()
{
  //当前光标
    qDebug()<<"coming"<<endl;           //可以看到行号随着光标的改变而改变

  QTextCursor tc = myTextEdit->textCursor();
  QTextLayout *pLayout = tc.block().layout();
  //当前光标在本BLOCK内的相对位置
  int nCurpos = tc.position() - tc.block().position();
  int nTextline = pLayout->lineForTextPosition(nCurpos).lineNumber() + tc.block().firstLineNumber();
  qDebug()<<nTextline<<endl;           //可以看到行号随着光标的改变而改变
}

并记录在头文件中。

还需要注意很多人出现了槽丢失的报错情况:

Object::connect: No such slot (QT槽丢失问题)

这是因为你的slot函数没有放在其下

private slot:

下面给出完整代码:

代码

main.cpp
#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.resize(300,300);
    w.show();

    return a.exec();
}
widget.h
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTextEdit>

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = 0);
private:
    QTextEdit *myTextEdit;
    int max_line;
private slots:
    void on_textEdit_cursorPositionChanged();
};

#endif
widget.cpp
#include "widget.h"
#include <QTextLayout>
#include <QTextBlock>
#include <QDebug>
void Widget::on_textEdit_cursorPositionChanged()
{
  //当前光标
    qDebug()<<"coming"<<endl;           //可以看到行号随着光标的改变而改变

  QTextCursor tc = myTextEdit->textCursor();
  QTextLayout *pLayout = tc.block().layout();
  //当前光标在本BLOCK内的相对位置
  int nCurpos = tc.position() - tc.block().position();
  int nTextline = pLayout->lineForTextPosition(nCurpos).lineNumber() + tc.block().firstLineNumber();
  qDebug()<<nTextline<<endl;           //可以看到行号随着光标的改变而改变
}

Widget::Widget(QWidget *parent) :
    QWidget(parent)
{
    setWindowTitle(tr("Viverrine-guest"));
    myTextEdit = new QTextEdit(this);
    myTextEdit->setFocus();               //得到鼠標
    myTextEdit->setText(tr("這是一段text內容:\n內容通常很多......"));  //設定內容文字
    myTextEdit->setGeometry(0,0,550,330); //設定位置大小
    qDebug()<<"nTextline"<<endl;           //可以看到行号随着光标的改变而改变
    connect( myTextEdit, SIGNAL(cursorPositionChanged()), SLOT(on_textEdit_cursorPositionChanged()) );

}

可以看到打印的行数。这里只读与可写在额外写到其中即可。

效果

这是我数据结构使用后缀数组实现(但不仅限于)的文字编辑器截图
在这里插入图片描述

GitHub 加速计划 / li / linux-dash
6
1
下载
A beautiful web dashboard for Linux
最近提交(Master分支:3 个月前 )
186a802e added ecosystem file for PM2 4 年前
5def40a3 Add host customization support for the NodeJS version 4 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐