二 自定义组件

05 UI建立

【Qt开发项目实战——代码编辑器Code Editor Demo——05 自定义组件——UI建立】

  • Add New——>Qt——>设计师组件——>选择Widget——>命名MyTextEdit
  • ui界面插入组件
  • 显示ui:
...

//新建文件
void MainWindow::on_new_file_triggered()
{
    MyTextEdit * myTextEdit = new MyTextEdit(this);
    ui->tabWidget->addTab(myTextEdit,"NewTab.xjy");

//    qDebug()<<"Start Create New File ...";
//    currentFile.clear();
//    ui->textEdit->setText("");
}

...
c++

06 滚动条绑定

【Qt开发项目实战——代码编辑器Code Editor Demo——06 自定义组件——水平滚动条绑定】

  • mytextedit.h
//mytextedit.h

...
    
private slots:
    void textEditHScrollBarChanged();
    void scrollBarChanged();

...

c++
  • mytextedit.cpp
//mytextedit.cpp

#include "mytextedit.h"
#include "ui_mytextedit.h"

MyTextEdit::MyTextEdit(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::MyTextEdit)
{
    ui->setupUi(this);

    connect(ui->textEdit->horizontalScrollBar(),SIGNAL(valueChanged(int)),this,SLOT(textEditHScrollBarChanged()));
    connect(ui->horizontalScrollBar,SIGNAL(valueChanged(int)),this,SLOT(scrollBarChanged()));
}

void MyTextEdit::scrollBarChanged()
{
    ui->textEdit->horizontalScrollBar()->setValue(ui->horizontalScrollBar->value());
}

void MyTextEdit::textEditVScrollBarChanged()
{
    ui->textBrowser->verticalScrollBar()->setValue(ui->textEdit->verticalScrollBar()->value());
}
c++

07 设置字体

【Qt开发项目实战——代码编辑器Code Editor Demo——07 自定义组件——设置字体】

  • mytextedit.h
//mytextedit.h

...

private:
    Ui::MyTextEdit *ui;
    void initConnect();
    void initFont();
};

#endif // MYTEXTEDIT_H
c++
  • mytextedit.cpp
//mytextedit.cpp

#include "mytextedit.h"
#include "ui_mytextedit.h"
#include <QDebug>

MyTextEdit::MyTextEdit(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::MyTextEdit)
{
    ui->setupUi(this);

    //绑定滚动条
    initConnect();

    //初始化字体
    initFont();
}

...


void MyTextEdit::initConnect()
{
    connect(ui->textEdit->horizontalScrollBar(),SIGNAL(valueChanged(int)),this,SLOT(textEditHScrollBarChanged()));
    connect(ui->horizontalScrollBar,SIGNAL(valueChanged(int)),this,SLOT(scrollBarChanged()));
}

void MyTextEdit::initFont()
{
    QFont font("Consolas",14);
    ui->textEdit->setFont(font);
    ui->textBrowser->setFont(font);
}

...
c++

08 显示行号

【Qt开发项目实战——代码编辑器Code Editor Demo——08 自定义组件——显示行号】

  • mytextedit.h
//mytextedit.h

...

private slots:
    ...

    void onTextChanged();

...

#endif // MYTEXTEDIT_H

c++
  • mytextedit.cpp
//mytextedit.cpp

...


void MyTextEdit::initConnect()
{
    connect(ui->textEdit,SIGNAL(textChanged()),this,SLOT(onTextChanged()));

    ...
}

...
    
void MyTextEdit::onTextChanged()
{
    int lineCount = ui->textEdit->document()->lineCount();
    for(int i = 0;i<lineCount;i++){
            text+= QString::number(i+1)+"\n";
        }

    ui->textBrowser->setMaximumWidth(25+QString::number(lineCount).length()*7);
    ui->textBrowser->setText(text);
}

c++

09 竖直滚动条绑定

【Qt开发项目实战——代码编辑器Code Editor Demo——09 自定义组件——竖直滚动条绑定】

  • mytextedit.h
//mytextedit.h

...

private slots:
   
    ...
        
    void textEditVScrollBarChanged();
    void textBrowserVScrollBarChanged();

...

c++
  • mytextedit.cpp
//mytextedit.cpp

...

void MyTextEdit::initConnect()
{
    ...
    
    //竖直滚动条
    connect(ui->textEdit->verticalScrollBar(),SIGNAL(valueChanged(int)),this,SLOT(textEditVScrollBarChanged()));
    connect(ui->textBrowser->verticalScrollBar(),SIGNAL(valueChanged(int)),this,SLOT(textBrowserVScrollBarChanged()));

}

...
    
void MyTextEdit::textEditVScrollBarChanged()
{
    ui->textBrowser->verticalScrollBar()->setValue(ui->textEdit->verticalScrollBar()->value());
}

void MyTextEdit::textBrowserVScrollBarChanged()
{
    ui->textEdit->verticalScrollBar()->setValue(ui->textBrowser->verticalScrollBar()->value());
}

...
c++

10 行号生成代码优化

【Qt开发项目实战——代码编辑器Code Editor Demo——10 自定义组件——行号生成代码优化】

  • mytextedit.cpp
//mytextedit.cpp

...

void MyTextEdit::onTextChanged()
{
    int lineCountOfTextEdit = ui->textEdit->document()->lineCount();
    qDebug()<<"lineCountOfTextEdit:"<<lineCountOfTextEdit;
    QString text = ui->textBrowser->toPlainText();

    int lineCountOfTextBrowser = text.trimmed().split("\n").length();
    qDebug()<<"lineCountOfTextBrowser:"<<lineCountOfTextBrowser;

    if(lineCountOfTextBrowser>lineCountOfTextEdit){
        for(int i = lineCountOfTextBrowser;i>lineCountOfTextEdit;i--){
            text.chop((QString::number(i)+"\n").length());
        }
    } else if (lineCountOfTextBrowser==1&&text.length()<1){
         text+= "1\n";
    }    else if(lineCountOfTextBrowser<lineCountOfTextEdit){
        for(int i = lineCountOfTextBrowser;i<lineCountOfTextEdit;i++){
            text+= QString::number(i+1)+"\n";
        }
    }

    ui->textBrowser->setMaximumWidth(25+QString::number(lineCountOfTextEdit).length()*7);
    ui->textBrowser->setText(text);

}
c++

小结——完整代码

  • mytextedit.h
#ifndef MYTEXTEDIT_H
#define MYTEXTEDIT_H

#include <QWidget>

namespace Ui {
class MyTextEdit;
}

class MyTextEdit : public QWidget
{
    Q_OBJECT

public:
    explicit MyTextEdit(QWidget *parent = nullptr);
    ~MyTextEdit();

private slots:
    void textEditHScrollBarChanged();
    void scrollBarChanged();

    void textEditVScrollBarChanged();
    void textBrowserVScrollBarChanged();

    void onTextChanged();

private:
    Ui::MyTextEdit *ui;
    void initConnect();
    void initFont();
};

#endif // MYTEXTEDIT_H

c++
  • mytextedit.cpp
#include "mytextedit.h"
#include "ui_mytextedit.h"
#include <QDebug>

MyTextEdit::MyTextEdit(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::MyTextEdit)
{
    ui->setupUi(this);

    //绑定滚动条
    initConnect();

    //初始化字体
    initFont();
}

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


void MyTextEdit::initConnect()
{
    connect(ui->textEdit,SIGNAL(textChanged()),this,SLOT(onTextChanged()));

    connect(ui->textEdit->horizontalScrollBar(),SIGNAL(valueChanged(int)),this,SLOT(textEditHScrollBarChanged()));
    connect(ui->horizontalScrollBar,SIGNAL(valueChanged(int)),this,SLOT(scrollBarChanged()));

    connect(ui->textEdit->verticalScrollBar(),SIGNAL(valueChanged(int)),this,SLOT(textEditVScrollBarChanged()));
    connect(ui->textBrowser->verticalScrollBar(),SIGNAL(valueChanged(int)),this,SLOT(textBrowserVScrollBarChanged()));

}

void MyTextEdit::initFont()
{
    QFont font("Consolas",14);
    ui->textEdit->setFont(font);
    ui->textBrowser->setFont(font);
}

void MyTextEdit::textEditHScrollBarChanged()
{
    ui->horizontalScrollBar->setMinimum(ui->textEdit->horizontalScrollBar()->minimum());
    ui->horizontalScrollBar->setMaximum(ui->textEdit->horizontalScrollBar()->maximum());
    ui->horizontalScrollBar->setPageStep(ui->textEdit->horizontalScrollBar()->pageStep());
    ui->horizontalScrollBar->setValue(ui->textEdit->horizontalScrollBar()->value());
}

void MyTextEdit::scrollBarChanged()
{
    ui->textEdit->horizontalScrollBar()->setValue(ui->horizontalScrollBar->value());
}

void MyTextEdit::textEditVScrollBarChanged()
{
    ui->textBrowser->verticalScrollBar()->setValue(ui->textEdit->verticalScrollBar()->value());
}

void MyTextEdit::textBrowserVScrollBarChanged()
{
    ui->textEdit->verticalScrollBar()->setValue(ui->textBrowser->verticalScrollBar()->value());
}

void MyTextEdit::onTextChanged()
{
    int lineCountOfTextEdit = ui->textEdit->document()->lineCount();
//    qDebug()<<"lineCountOfTextEdit:"<<lineCountOfTextEdit;
    QString text = ui->textBrowser->toPlainText();

    int lineCountOfTextBrowser = text.trimmed().split("\n").length();
//    qDebug()<<"lineCountOfTextBrowser:"<<lineCountOfTextBrowser;

    if(lineCountOfTextBrowser>lineCountOfTextEdit){
        for(int i = lineCountOfTextBrowser;i>lineCountOfTextEdit;i--){
            text.chop((QString::number(i)+"\n").length());
        }
    } else if (lineCountOfTextBrowser==1&&text.length()<1){
         text+= "1\n";
    }    else if(lineCountOfTextBrowser<lineCountOfTextEdit){
        for(int i = lineCountOfTextBrowser;i<lineCountOfTextEdit;i++){
            text+= QString::number(i+1)+"\n";
        }
    }

    ui->textBrowser->setMaximumWidth(25+QString::number(lineCountOfTextEdit).length()*7);
    ui->textBrowser->setText(text);

}
c++
打赏
  • 微信
  • 支付宝
评论
来发评论吧~
···

歌手: