有什么区别QTextEdit和QPlainTextEdit,为什么使用一个而不是另一个?
我正在编写一个文本编辑器作为学习Qt5的练习,现在我想知道是否使用QTextEdit或QPlainTextEdit.到目前为止,我只发现你可以显示图像QTextEdit,但除此之外,它们看起来与我相似.我的文本编辑器应该支持一些基本的语法高亮(可能使用textChanged()信号),但这几乎与需求一样.
谷歌搜索"QTextEdit vs QPlainTextEdit"和"QTextEdit与QPlainTextEdit相比"并没有给我任何可以比较两个类的结果.
我需要将文本追加到QPlainTextEdit不添加新行的文本,但是这两种方法appendPlainText(),并appendHtml()实际上增加了新的段落.
我可以手动执行以下操作QTextCursor:
QTextCursor text_cursor = QTextCursor(my_plain_text_edit->document());
text_cursor.movePosition(QTextCursor::End);
text_cursor.insertText("string to append. ");
Run Code Online (Sandbox Code Playgroud)
这是有效的,但如果它在追加之前我还需要保持在底部滚动.
我试图从Qt的源文件副本的逻辑,但我坚持就可以了,因为那里实际上QPlainTextEditPrivate是使用类,我找不到这样做没有它的方法:比如说,我没有看到的方法verticalOffset()在QPlainTextEdit.
实际上,这些来源包含许多奇怪的东西(至少在初看起来),我不知道如何实现它.
以下是源代码append():http://code.qt.io/cgit/qt/qt.git/tree/src/gui/widgets/qplaintextedit.cpp#n2763
我正在使用QPlainTextEdit和编写自定义代码编辑器,QSyntaxHighlighter我遇到了一个小故障.我想在选择中保留语法突出显示.但是,选择的颜色(环境颜色)会覆盖由QSyntaxHighlighterhtml标记突出显示的文本的颜色.保留字体系列等其他属性.
例:
没有选择:选择:

(我想Hello变成绿色,World!变成黑色)
我也尝试将样式表设置为:
QPlainTextEdit {
selection-color: rgba(0, 0, 0, 0);
selection-background-color: lightblue;
}
Run Code Online (Sandbox Code Playgroud)
结果:

背景颜色覆盖文本,并且文本颜色alpha = 0不可见.我这样做只是为了排除语法颜色持续存在的想法selection-color.事实上它被覆盖了selection-background-color.
编辑:不,如果我也设置selection-background-color为rgba(0, 0, 0, 0),则没有选择,并且该选择中没有文本.我所看到的只是背景.
使整个光标的线突出显示的以下片段的方法似乎是要走的路,但我基本上最终会重新实现所有的选择机制......
QList<QTextEdit::ExtraSelection> extraSelections;
QTextCursor cursor = textCursor();
QTextEdit::ExtraSelection selection;
selection.format.setBackground(lineHighlightColor_);
selection.format.setProperty(QTextFormat::FullWidthSelection, true);
selection.cursor = cursor;
selection.cursor.clearSelection();
extraSelections.append(selection);
setExtraSelections(extraSelections);
Run Code Online (Sandbox Code Playgroud)
有没有更简单的解决方案?
非常小的问题:
我已经编写了一个带有基于QPlainTextEdit的文本编辑小部件的小型IDE.当您将鼠标移到它上面时,光标将按预期变为插入/文本光标.如果按F5键,则会禁用该窗口并运行一个小脚本,然后重新启用该窗口,并为该文本区域提供焦点.
不知何故,这会将光标从文本光标更改为指针.如果将光标移出文本区域然后再返回到文本区域,则会再次变为文本光标.
有没有办法以编程方式触发此刷新操作?
更新:似乎与进度条有关:
#!/usr/bin/env python
import sys
import time
from PyQt4 import QtGui, QtCore
from PyQt4.QtCore import Qt
class TinyIDE(QtGui.QMainWindow):
def __init__(self, filename=None):
super(TinyIDE, self).__init__()
self.setWindowTitle('Tiny IDE test')
# Add menu item
menu = self.menuBar()
menu_run = menu.addMenu('&Run')
tool_run = QtGui.QAction('&Run', self)
tool_run.setShortcut('F5')
tool_run.triggered.connect(self.action_run)
menu_run.addAction(tool_run)
# Add editor
self._editor = QtGui.QPlainTextEdit()
self._editor.setPlainText('Press F5 to run')
self.setCentralWidget(self._editor)
self._editor.setFocus()
def action_run(self):
pbar = None
try:
self.setEnabled(False)
pbar = QtGui.QProgressDialog('Running script', 'Cancel', 0, 10)
pbar.setWindowModality(Qt.WindowModal)
pbar.setAutoClose(False)
pbar.setAutoReset(False)
pbar.show()
for i in …Run Code Online (Sandbox Code Playgroud) 我想在放入一些文本后自动滚动到QPlainTextEdit小部件的顶部.我怎么能意识到这一点?
我有一个GUI应用程序,其主要部分是QPlainTextEdit.它用于显示应用程序的日志,因此关联的文本无线逐行增长.
由于应用程序要运行很长时间,我需要限制将为此日志分配的内存.因此,我希望有一些maxNumLines或maxNumCharacters参数可以确保在到达时将截断历史记录,即在添加新行时(即日志旋转)将删除头行.
为实现这一目标,我发现了这些功能
// get the associated text
QString toPlainText () const
// set the associated text
void setPlainText ( const QString & text )
Run Code Online (Sandbox Code Playgroud)
因此,像这个未经测试的代码可能会做的伎俩:
QString &tmp = pte.toPlainText();
while (tmp.size() > maxNumCharacters) {
// remove lines from the head of the string until the desired size is reached
// removes nothing if "\n" could not be found
tmp.remove(0, tmp.indexOf("\n")+1);
}
pte.setPlainText( tmp );
Run Code Online (Sandbox Code Playgroud)
这是从第一行中删除第一行的方法QPlainTextEdit吗?是否有其他Qt Text GUI元素可以更好地适应这个任务(设置最大行数并在列表的头部截断),例如以某种方式显示QStringList我可以存储行(st我可以轻松地 …
我很困惑为什么QPlainTextEdit小部件在添加到QFormLayout时不会垂直调整大小.在下面的代码中,文本字段正确地水平缩放,但不会垂直向上缩放.
谁能解释这种行为并提供解决方案?我已经尝试过所有我知道的技巧都无济于事.
from PyQt4 import QtGui
class Diag(QtGui.QDialog):
def __init__(self, parent, *args, **kwargs):
QtGui.QDialog.__init__(self, parent)
layout = QtGui.QFormLayout(self)
widg = QtGui.QPlainTextEdit(self)
layout.addRow('Entry', widg)
if __name__ == '__main__': #pragma: no cover
app = QtGui.QApplication([])
window = Diag(None)
window.show()
app.exec_()
Run Code Online (Sandbox Code Playgroud)
下面是一个QPlainTextEdit小部件没有垂直调整大小的示例: QPlainTextEdit已添加到QFormLayout但未垂直调整大小http://s9.postimage.org/ejvmp1wtr/qplaintextedit_in_qformlayout_not_resize.jpg
这是在Windows 7上使用PyQt 4.5.2和Python 32位2.6.
谢谢.
我有一个QTabWidget,每个标签都有一个QPlainTextEdit小部件.那么,我如何访问每个标签小部件?如何编辑该小部件?
我有一个 QPlainTextEdit 并且其中突出显示了一些单词,现在我希望当我用鼠标悬停在它上面时,它会向我显示一个工具提示,其中包含有关此突出显示单词的描述或类似内容,在 QT IDE 中类似这样
但我不知道如何开始这个所以任何想法、代码或类似的项目来检查这个。
问题:我想为带有附加标签的文本实现文本编辑小部件.我希望某些标签在某些情况下不可见,这样它们就不会分散用户的注意力.
环境:我正在使用PyQt并且更喜欢使用QPlainTextWidget和QSyntaxHighlighter.
方法:用QSyntaxHighlighter我可以设置QTextCharFormat为符合我的要求,该字符串.QTextCharFormat给了我所有字体属性,如大小,颜色等,但是:我没有找到隐藏文本或将其大小减小到零的选项.
我不想删除或替换标签,因为这会引入更多代码(复制应该包含标签,而不能QSyntaxHighlighter用于根据标签格式化剩余的文本).
更新:到目前为止,我发现了一个丑陋的黑客.通过将QTextFormat :: FontLetterSpacing设置为较小的值,文本将占用越来越少的空间.与透明色相结合,文字就像隐形.
问题:在我的测试中,这仅适用于低至0.016%的字母间距.间距下方重置为100%.