QT-qtextedit怎么设置部分文字只读(部分可编辑)

综述

最近在写一个文件系统。
基础架构写了一段时间了,基本差不多了。还需要用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()) );

}

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

效果

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

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值