2 vikilogic vikilogic 于 2016.03.11 11:43 提问

一个QT中特殊输入控件的实现问题

我需要制作出一个QT输入控件,用户能在其中正常输入
数字字符,但需要实现的效果为:
每输入4个字符后自动空一格,即每自个字符为一组
每输入10组字符后自动换下一行
每输入达到5行后自动空一段,继续输入另起一段,效果见截图:图片说明

打算用QTextEdit来实现,请教比较合适的实现方法,不限制最终用什么输入控件,
谢谢!

1个回答

qq423399099
qq423399099   Ds   Rxr 2016.03.11 14:55
已采纳

用QTextEdit实现了一下,应该能满足LZ的要求
main.cpp:

 #include "mainwindow.h"
#include <QApplication>

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

    return a.exec();
}

mainwindow.h:

 #ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
    int count_char;
    int count_row;
    int count_line;

public slots:
    void ProcessText();
};

#endif // MAINWINDOW_H

mainwindow.cpp:

 #include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    count_char = 0;
    count_row = 0;
    count_line = 0;
    connect(ui->textEdit, SIGNAL(textChanged()), this, SLOT(ProcessText()));
}

void MainWindow::ProcessText()
{
    if(++count_char == 4)
    {
        if(++count_row == 10)
        {
            if(++count_line == 5)
            {
                ui->textEdit->insertPlainText("\n");
                count_line = 0;
            }
            ui->textEdit->insertPlainText("\n");
            count_row = 0;
        }
        else
            ui->textEdit->insertPlainText(" ");
        count_char = 0;
    }
}

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

运行结果:
图片说明

vikilogic
vikilogic 回复小灸舞: 就是不知道我这种想法如何实现。如果重刷整个TEXTEDIT的话,担心在后续已输内容很多时会卡。
接近 2 年之前 回复
qq423399099
qq423399099 回复龙初越: lz想法不错啊,其实不把空格和回车存进去应该很简单啊,感觉增删以后,直接重刷一遍textedit
接近 2 年之前 回复
vikilogic
vikilogic 回复小灸舞: 还是有些问题,字符的后续处理起来比较头疼。不成熟地问一下,有没有可能实现出这样一种情况:因为我需要的输入框里的字符在后续都是需要提取出来处理的,每组间的空格和几组间的换行纯粹是为了好看整洁而没有其他意义(但是要求是必须如此),且后续字符提取时还不能包括这些空格和换行,因此我认为比较简单的是,能否在textedit里嵌入一种图片之类的,这个图片只不过是一种透明的表格形状,且透明表格的线还比较粗,这样在textedit里输入的时候,输入碰到图片处(实际是透明的)就自动跳到图片后面继续输入,这样看起来就像是自动空格了一样,但是整个输入仍是一个输入而不是表格里不同的单元格,这样在段落中删、增、改时以及后续提取时都比较方便。有点天马星空,不知我这种思路有实现的可能否?感谢!
接近 2 年之前 回复
vikilogic
vikilogic 还没来得及试验,先感谢一下!
接近 2 年之前 回复
qq423399099
qq423399099 回复龙初越: 创建一个BOOL a = false;用来标识是否删除了某个字符 感觉LZ可以用textEdit的cursorPositionChanged这个信号记录光标变化的位置,如果前一次位置-后一次位置=1并且a为true表示用户真的删除了 处理完记得把a再置为false 用void QWidget::keyPressEvent(QKeyEvent *event)捕获键盘信号,如果捕获到backspace就将a=true; 之前的每个字符都存起来就好了,位置找到了并且知道点了backspace,所有字符向前移一格就好
接近 2 年之前 回复
vikilogic
vikilogic 试验了一下,基本可以满足,在删除时会出现一些问题,我再分析一下。另外还有一些问题,怪我需求没有提完善,还有需求如下:在输入完一堆字符后,随意把光标点在之前某一个字符上,按删除键删除字符后要求后面整个所有字符跟着前移一位但仍旧保持4位一组的状态,这点我还没有想好有啥好办法,如能指教,感谢。
接近 2 年之前 回复
qq423399099
qq423399099 LZ记得ui里面拖一下textEdit
接近 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!