QT 怎么实现多行掩码

JQjiang54 2017-07-05 10:20:27
Qt怎么实现多行掩码,能够像QLineEdit当中的setInputMask函数一样, QLineEdit只能一行,QTextEdit没有相关方法,希望大神多多帮忙
...全文
289 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
JQjiang54 2017-07-09
  • 打赏
  • 举报
回复
引用 4 楼 n7zj0x8 的回复:
我写了个代码,拖大的说,很难理解,算法很多,你只能自己理解. 估计有些bug,但是我能给出的思路大概是这样的,或许还有其它方式实现.暂时只想到这种. 链接:http://pan.baidu.com/s/1mivAjcW 密码:nvmq 大概是这样的

   MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    connect(ui->textEdit->document(), SIGNAL(contentsChange(int,int,int)),
            this, SLOT(onContentsChange(int,int,int)));
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::onContentsChange(int position, int charsRemoved, int charsAdded)
{
    const QString inputMask = "*";

    //添加
    if (charsAdded > charsRemoved)
    {
        QTextCursor cursor = ui->textEdit->textCursor();

        if (charsRemoved == 0)
        {
            cursor.setPosition(position);
            cursor.setPosition(position + charsAdded - charsRemoved, QTextCursor::KeepAnchor);
            QString text = cursor.selectedText();
            doc.insert(position, text);
        }
        else
        {
            //修改之后的位置,
            int posNow = cursor.position();
            cursor.setPosition(position);
            cursor.setPosition(posNow, QTextCursor::KeepAnchor);

            //新加入的字符.
            QString textAdded = cursor.selectedText();
            int removed = textAdded.size() - (charsAdded - charsRemoved);

            doc.remove(position, removed);
            doc.insert(position, textAdded);
        }


        //替换
        ui->textEdit->document()->blockSignals(true);
        cursor.setPosition(position);
        int end = (position + charsAdded) >= ui->textEdit->document()->characterCount() ? (position + charsAdded - 1) : (position + charsAdded);
        cursor.setPosition(end, QTextCursor::KeepAnchor);
        QString text = cursor.selectedText();
        text.replace(QRegExp("[^\\n]"), inputMask);
        cursor.insertText(text);
        ui->textEdit->document()->blockSignals(false);
    }
    //修改
    else if (charsAdded == charsRemoved)
    {
        QTextCursor cursor = ui->textEdit->textCursor();
        cursor.setPosition(position);
        cursor.setPosition(position + charsAdded, QTextCursor::KeepAnchor);
        QString text = cursor.selectedText();
        doc.replace(position, text.length(), text);

        //替换
        ui->textEdit->document()->blockSignals(true);
        text.replace(QRegExp("[^\\n]"), inputMask);
        cursor.insertText(text);
        ui->textEdit->document()->blockSignals(false);
    }
    //删除
    else
    {
        doc.remove(position, charsRemoved);
        if (charsAdded > 0)
        {
            QTextCursor cursor = ui->textEdit->textCursor();
            cursor.setPosition(position);
            cursor.setPosition(position + charsAdded, QTextCursor::KeepAnchor);
            QString text = cursor.selectedText();
            doc.insert(position, text);

            //替换
            ui->textEdit->document()->blockSignals(true);
            text.replace(QRegExp("[^\\n]"), inputMask);
            cursor.insertText(text);
            ui->textEdit->document()->blockSignals(false);
        }
    }

    ui->textEdit_2->setPlainText(doc);
}

谢谢你,辛苦了
大卫无限 2017-07-05
  • 打赏
  • 举报
回复
估计需要禁止undo和redo因为这个实现起来会更麻烦.
大卫无限 2017-07-05
  • 打赏
  • 举报
回复
我写了个代码,拖大的说,很难理解,算法很多,你只能自己理解. 估计有些bug,但是我能给出的思路大概是这样的,或许还有其它方式实现.暂时只想到这种. 链接:http://pan.baidu.com/s/1mivAjcW 密码:nvmq 大概是这样的

   MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    connect(ui->textEdit->document(), SIGNAL(contentsChange(int,int,int)),
            this, SLOT(onContentsChange(int,int,int)));
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::onContentsChange(int position, int charsRemoved, int charsAdded)
{
    const QString inputMask = "*";

    //添加
    if (charsAdded > charsRemoved)
    {
        QTextCursor cursor = ui->textEdit->textCursor();

        if (charsRemoved == 0)
        {
            cursor.setPosition(position);
            cursor.setPosition(position + charsAdded - charsRemoved, QTextCursor::KeepAnchor);
            QString text = cursor.selectedText();
            doc.insert(position, text);
        }
        else
        {
            //修改之后的位置,
            int posNow = cursor.position();
            cursor.setPosition(position);
            cursor.setPosition(posNow, QTextCursor::KeepAnchor);

            //新加入的字符.
            QString textAdded = cursor.selectedText();
            int removed = textAdded.size() - (charsAdded - charsRemoved);

            doc.remove(position, removed);
            doc.insert(position, textAdded);
        }


        //替换
        ui->textEdit->document()->blockSignals(true);
        cursor.setPosition(position);
        int end = (position + charsAdded) >= ui->textEdit->document()->characterCount() ? (position + charsAdded - 1) : (position + charsAdded);
        cursor.setPosition(end, QTextCursor::KeepAnchor);
        QString text = cursor.selectedText();
        text.replace(QRegExp("[^\\n]"), inputMask);
        cursor.insertText(text);
        ui->textEdit->document()->blockSignals(false);
    }
    //修改
    else if (charsAdded == charsRemoved)
    {
        QTextCursor cursor = ui->textEdit->textCursor();
        cursor.setPosition(position);
        cursor.setPosition(position + charsAdded, QTextCursor::KeepAnchor);
        QString text = cursor.selectedText();
        doc.replace(position, text.length(), text);

        //替换
        ui->textEdit->document()->blockSignals(true);
        text.replace(QRegExp("[^\\n]"), inputMask);
        cursor.insertText(text);
        ui->textEdit->document()->blockSignals(false);
    }
    //删除
    else
    {
        doc.remove(position, charsRemoved);
        if (charsAdded > 0)
        {
            QTextCursor cursor = ui->textEdit->textCursor();
            cursor.setPosition(position);
            cursor.setPosition(position + charsAdded, QTextCursor::KeepAnchor);
            QString text = cursor.selectedText();
            doc.insert(position, text);

            //替换
            ui->textEdit->document()->blockSignals(true);
            text.replace(QRegExp("[^\\n]"), inputMask);
            cursor.insertText(text);
            ui->textEdit->document()->blockSignals(false);
        }
    }

    ui->textEdit_2->setPlainText(doc);
}

jklinux 2017-07-05
  • 打赏
  • 举报
回复
封装一类,类里用一个布局管理器管理那几个QLineEdit对象应就可以解决窗口大小变化的问题
JQjiang54 2017-07-05
  • 打赏
  • 举报
回复
没有用,当拖动窗口大小时,每一行显示的长度不一样的,多个QLineEidt不能满足
jklinux 2017-07-05
  • 打赏
  • 举报
回复
可不可以由多个QLineEdit对象组合来解决? 当一个QLineEdit对象输入完成后,让下一个对象得到焦点

16,203

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧