消息关闭
    暂无新消息!

QT 怎么实现多行掩码

问题作者 : 嗒D2017-07-07发布
Qt怎么实现多行掩码,能够像QLineEdit当中的setInputMask函数一样, QLineEdit只能一行,QTextEdit没有相关方法,希望大神多多帮忙

5个回答

︿ 2
没有用,当拖动窗口大小时,每一行显示的长度不一样的,多个QLineEidt不能满足
︿ 2
我写了个代码,拖大的说,很难理解,算法很多,你只能自己理解.
估计有些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);
}

︿ 2
可不可以由多个QLineEdit对象组合来解决?  当一个QLineEdit对象输入完成后,让下一个对象得到焦点
︿ 0
封装一类,类里用一个布局管理器管理那几个QLineEdit对象应就可以解决窗口大小变化的问题