行号清除器

前段时间在cnblogs上看到了一个行号清除器,不过是命令行模式的,一直想做个UI风格的,趁昨晚有空就做了个,好东东当然要大家共享了。。。



在做此软件时遇到的几个问题:

1.如何才能用一种有效的方法去掉行号。

我先考虑的是将每行读取出来后先去掉头尾的空格然后通过行号后的第一个空格将其分开,取后面的就可以了,但是这种方法效率太低了。

通过查询MSDN找到了TrimStart方法,但是如果在行号前有空格的话,这样就不行了,所以后来想到了在前面加一个空方法。但是使用这个方法有个缺点,就是如果行号中有编程时末定义的其它字符就无法去掉其它字符了(如.,、等等),这就样灵活性就大大降低了。但是由于本人能力有限,所以只能做到在界面中添加一个文本框来让用户自己添加其它字符,所以希望各位高手还请多多指教。

2.Textbox1内的内容转换后传入Textbox2

       在这个问题上我先是想用类似vb里面的chr(10)+chr(13)来做换行符,但是在c#中我不知道怎么做。

       正在思考chr(10)+chr(13)c#中是否有等效的换行的时候,想到了前些天看到kim的一篇中使用的StringReader它就可以做到按行读取,所以就釆取了这种方式,但是到目前为止还是没能找到个在c#中与chr(10)+chr(13) 等效的换行,所以还是要请那位高人指点指点。。。



附上源代码: 行号清除器.rar  
你可以通过重载QPlainTextEdit的paintEvent()函数,自定义绘制行号的方式,然后在selectionChanged()信号中重新绘制高亮行。以下是一个简单的实现示例: ```python from PyQt5.QtGui import QTextCursor, QColor, QPainter from PyQt5.QtWidgets import QPlainTextEdit class LineNumberTextEdit(QPlainTextEdit): def __init__(self, parent=None): super(LineNumberTextEdit, self).__init__(parent) self.current_line = None self.line_number_area_width = 50 def paintEvent(self, event): super(LineNumberTextEdit, self).paintEvent(event) if self.current_line: painter = QPainter(self.viewport()) painter.fillRect(0, self.current_line * self.fontMetrics().height(), self.width(), self.fontMetrics().height(), QColor(255, 200, 0)) def resizeEvent(self, event): super(LineNumberTextEdit, self).resizeEvent(event) self.updateLineNumberAreaWidth() def lineNumberAreaWidth(self): digits = 1 count = max(1, self.blockCount()) while count >= 10: count /= 10 digits += 1 return self.fontMetrics().width('9') * digits def updateLineNumberAreaWidth(self): self.setViewportMargins(self.lineNumberAreaWidth(), 0, 0, 0) def lineNumberAreaPaintEvent(self, event): painter = QPainter(self.lineNumberArea) painter.fillRect(event.rect(), QColor(240, 240, 240)) block = self.firstVisibleBlock() block_number = block.blockNumber() top = self.blockBoundingGeometry(block).translated(self.contentOffset()).top() bottom = top + self.blockBoundingRect(block).height() while block.isValid() and top <= event.rect().bottom(): if block.isVisible() and bottom >= event.rect().top(): number = str(block_number + 1) painter.setPen(QColor(150, 150, 150)) painter.drawText(0, top, self.lineNumberArea.width(), self.fontMetrics().height(), Qt.AlignRight, number) block = block.next() top = bottom bottom = top + self.blockBoundingRect(block).height() block_number += 1 def lineNumberAreaMousePressEvent(self, event): self.current_line = None self.viewport().update() def lineNumberAreaMouseMoveEvent(self, event): cursor = self.cursorForPosition(event.pos()) if not cursor.isNull(): self.current_line = cursor.blockNumber() self.viewport().update() def lineNumberAreaLeaveEvent(self, event): self.current_line = None self.viewport().update() def lineNumberAreaSizeHint(self): return QSize(self.lineNumberAreaWidth(), 0) def updateLineNumberArea(self, rect): self.lineNumberArea.update(0, rect.y(), self.lineNumberArea.width(), rect.height()) def resizeLineNumberArea(self): self.lineNumberArea.setGeometry(0, 0, self.lineNumberAreaWidth(), self.height()) def showEvent(self, event): super(LineNumberTextEdit, self).showEvent(event) if not self.lineNumberArea: self.lineNumberArea = LineNumberArea(self) self.connect(self.lineNumberArea, SIGNAL('updateLineNumberArea'), self.updateLineNumberArea) self.connect(self.lineNumberArea, SIGNAL('resizeLineNumberArea'), self.resizeLineNumberArea) self.lineNumberArea.show() def hideEvent(self, event): super(LineNumberTextEdit, self).hideEvent(event) if self.lineNumberArea: self.lineNumberArea.hide() def scrollContentsBy(self, dx, dy): super(LineNumberTextEdit, self).scrollContentsBy(dx, dy) self.lineNumberArea.scroll(0, dy) def resizeEvent(self, event): super(LineNumberTextEdit, self).resizeEvent(event) self.lineNumberArea.resizeLineNumberArea() def selectionChanged(self): super(LineNumberTextEdit, self).selectionChanged() self.viewport().update() def keyPressEvent(self, event): if event.modifiers() == Qt.ControlModifier and event.key() == Qt.Key_C: cursor = self.textCursor() selected_text = cursor.selectedText() lines = selected_text.split('\n') if len(lines) > 1: for i, line in enumerate(lines): if i == len(lines) - 1: lines[i] = line else: lines[i] = line + '\n' QApplication.clipboard().setText(selected_text) else: super(LineNumberTextEdit, self).keyPressEvent(event) else: super(LineNumberTextEdit, self).keyPressEvent(event) def mousePressEvent(self, event): if event.button() == Qt.LeftButton: self.current_line = None self.viewport().update() super(LineNumberTextEdit, self).mousePressEvent(event) def mouseMoveEvent(self, event): cursor = self.cursorForPosition(event.pos()) if not cursor.isNull(): self.current_line = cursor.blockNumber() self.viewport().update() super(LineNumberTextEdit, self).mouseMoveEvent(event) def leaveEvent(self, event): self.current_line = None self.viewport().update() super(LineNumberTextEdit, self).leaveEvent(event) def focusInEvent(self, event): super(LineNumberTextEdit, self).focusInEvent(event) self.current_line = None self.viewport().update() def focusOutEvent(self, event): super(LineNumberTextEdit, self).focusOutEvent(event) self.current_line = None self.viewport().update() ``` 在这个示例中,我们继承了QPlainTextEdit并添加了一些自定义行为。其中,我们使用了一个LineNumberArea类来显示行号,并在编辑器的paintEvent()中绘制高亮行。 在构造函数中,我们初始化了一些变量和信号连接。我们还创建了一个LineNumberArea对象,并将其与updateLineNumberArea()和resizeLineNumberArea()信号连接起来。这样,我们可以在编辑器的大小发生变化时调整行号区域的大小。 在paintEvent()函数中,我们首先调用父类的paintEvent()函数,以便在编辑器中绘制文本。然后,如果当前行不为空,我们绘制黄色矩形来高亮当前行。 在resizeEvent()函数中,我们更新行号区域的宽度,并在updateLineNumberArea()函数中更新行号区域的绘图。 在selectionChanged()函数中,我们重新绘制高亮行。 在mousePressEvent()、mouseMoveEvent()和leaveEvent()函数中,我们设置当前行为None,并在viewport()上调用update()函数,从而清除高亮行。 最后,我们覆盖了QPlainTextEdit的keyPressEvent()函数,以便在按下Ctrl+C键时复制多行文本。我们还覆盖了focusInEvent()和focusOutEvent()函数,以便在编辑器失去焦点时清除高亮行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值