标签: qtextdocument

QTextDocument :: drawContents仅以96 dpi渲染

我正在使用QPrinter和QPainter创建一个高分辨率(1200 dpi)的PDF文档.我试图使用QTextDocument :: drawContents以相同的分辨率绘制文本.我想使用QTextDocument的原因是因为我需要在我的文档中包含许多表格和格式化文本.

我的问题是QTextDocument :: drawContents总是以屏幕分辨率插入文本,在我的情况下是96 dpi.到目前为止,我找到的所有解决方案都建议缩放文本以达到正确的大小.但是,这导致了低质量的文本,这是我买不起的.

我的问题:有没有办法以高分辨率绘制QTextDocument的内容?

下面的代码创建一个包含2行文本的PDF文件,一行使用QPainter :: drawText绘制,另一行使用QTextDocument :: drawContents绘制.我使用了Arial 8pt字体,以强调缩放产生的低质量问题.

// Read the screen resolution for scaling
QPrinter screenPrinter(QPrinter::ScreenResolution);
int screenResolution = screenPrinter.resolution();

// Setup the font
QFont font;
font.setFamily("Arial");
font.setPointSize(8);

// Define locations to insert text
QPoint textLocation1(20,10);
QPoint textLocation2(20,20);

// Define printer properties
QPrinter printer(QPrinter::HighResolution); 
printer.setOrientation(QPrinter::Portrait);
printer.setPaperSize(QPrinter::A4);
printer.setResolution(1200);
printer.setOutputFormat(QPrinter::PdfFormat);
printer.setOutputFileName("test.pdf");    

// Write text using QPainter::drawText
QPainter painter;
painter.begin(&printer);
painter.setFont(font);
painter.drawText(textLocation1, "QPainter::drawText");

// Write text using QTextDocument::drawContents
QTextDocument doc;
doc.setPageSize(printer.pageRect().size());
QTextCursor cursor(&doc);
QTextCharFormat charFormat; …
Run Code Online (Sandbox Code Playgroud)

c++ pdf qt dpi qtextdocument

8
推荐指数
1
解决办法
4323
查看次数

将 QTextCursor 移动到最后的问题

我正在尝试在我正在编写的编辑器中实现简单的文本搜索。一切都很好,直到出现这个问题!我正在尝试在这里实现向后搜索。过程是:向后查找主题,如果没有找到,蜂鸣一声,如果再次按下查找按钮,则到文档末尾,重新进行查找。“reachedEnd”是一个 int,定义为编辑器类的私有成员。这是执行向后搜索的函数。

void TextEditor::findPrevPressed() {
    QTextDocument *document = curTextPage()->document();
    QTextCursor    cursor   = curTextPage()->textCursor();

    QString find=findInput->text(), replace=replaceInput->text();


    if (!cursor.isNull()) {
        curTextPage()->setTextCursor(cursor);
        reachedEnd = 0;
    }
    else {
        if(!reachedEnd) {
            QApplication::beep();
            reachedEnd = 1;
        }
        else {
            reachedEnd = 0;
            cursor.movePosition(QTextCursor::End);
            curTextPage()->setTextCursor(cursor);
            findPrevPressed();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是光标没有移动到最后!它返回 False,这意味着失败。这怎么会失败?!!提前致谢。

qt4 qtextdocument

6
推荐指数
1
解决办法
9220
查看次数

用QSyntaxHighlighter隐藏文本

问题:我想为带有附加标签的文本实现文本编辑小部件.我希望某些标签在某些情况下不可见,这样它们就不会分散用户的注意力.

环境:我正在使用PyQt并且更喜欢使用QPlainTextWidgetQSyntaxHighlighter.

方法:QSyntaxHighlighter我可以设置QTextCharFormat为符合我的要求,该字符串.QTextCharFormat给了我所有字体属性,如大小,颜色等,但是:我没有找到隐藏文本或将其大小减小到零的选项.

我不想删除或替换标签,因为这会引入更多代码(复制应该包含标签,而不能QSyntaxHighlighter用于根据标签格式化剩余的文本).

更新:到目前为止,我发现了一个丑陋的黑客.通过将QTextFormat :: FontLetterSpacing设置为较小的值,文本将占用越来越少的空间.与透明色相结合,文字就像隐形.

问题:在我的测试中,这仅适用于低至0.016%的字母间距.间距下方重置为100%.

qt syntax-highlighting pyqt qtextdocument qplaintextedit

6
推荐指数
1
解决办法
951
查看次数

QPushButton中的两种颜色文本

我需要一个QPushButton,文本中有两种颜色.我在QTextDocument中找到了一个带有html代码的解决方案,它正在运行.但是我需要居中对齐并且html代码不起作用.

 QTextDocument Text;
  Text.setHtml("<p align=center><font>Button</font><br/><font color=yellow>1</font></p>");

   QPixmap pixmap(Text.size().width(), Text.size().height());
   pixmap.fill( Qt::transparent );
   QPainter painter(&pixmap);
   Text.drawContents(&painter, pixmap.rect());

   QIcon ButtonIcon(pixmap);
   ui->toolButton->setText("");
   ui->toolButton->setIcon(ButtonIcon);
   ui->toolButton->setIconSize(pixmap.rect().size());
Run Code Online (Sandbox Code Playgroud)

我明白了, 在此输入图像描述

相同的代码HTML在QLabel中工作

ui->label->setText("<p align=center><font>Label</font><br/><font color=yellow>1</font></p>");
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

有解决方案吗

非常感谢.

c++ qt qt4 qtextdocument qpushbutton

6
推荐指数
1
解决办法
3150
查看次数

QPrinter无法正确设置HTML页面样式以在PDF文档中呈现图像

我想创建一个具有正确样式HTML的PDF文档.这就是我想要的:

QTextDocument *doc = new QTextDocument();
const char* s1 = "<html><head><style>body { font-family: sans-serif;}.note-atomic { background: rgb(242,242,242); width: 1000px; margin: 5px auto; border: 1px solid grey; border-radius: 8px;padding: 5px;}</style></head><body><div class = 'note-atomic'>Hi</div><img src = '/Users/attitude/Desktop/RnSghvV.png' width='400' height='300' /></body></html>";
doc->setHtml(QString::fromStdString(s1));

QPrinter *printer = new QPrinter();
printer->setOutputFileName("/Users/attitude/Desktop/fool.pdf");
printer->setOutputFormat(QPrinter::PdfFormat);

QPainter *painter = new QPainter();
painter->begin( printer );
doc->drawContents(painter, printer->pageRect().translated( -printer->pageRect().x(), -    printer->pageRect().y() ));
doc->print(printer);

const char* s2 = "<html><body><div>Bye</div></body></html>";
doc->setHtml(QString::fromStdString(s2));

printer->newPage();
doc->drawContents(painter, printer->pageRect().translated( -printer->pageRect().x(), - printer->pageRect().y() ));

doc->print(printer);
painter->end();
Run Code Online (Sandbox Code Playgroud)

我希望PDF有两页 - 第一页有文字Hi …

c++ pdf qt qtextdocument qprinter

6
推荐指数
1
解决办法
1415
查看次数

设置QGraphicsTextItem文本内容的精确高度和宽度

我需要创建具有文本内容的确切宽度和高度的文本项.
文本的高度是最重要的要求.
文本的位置应该与文本本身相关.

我还必须能够将它放在画布上的确切位置.

假设一个(可打印的)画布(在一个更大的画布上QGraphicsScene),比如5英寸宽和1英寸高,我的文字应该能够从上下左右拉伸 - 并且放在画布上,而不是部分画出.


我正在QGraphicsTextItem为我的项目类型进行子类化.我正在调整大小,使用QTransform()所需的大小 - 以英寸或毫米或像素(72*英寸)为单位.
同时将document()边距设置为0,内部的任何内容(如QTextBlockFormat边距)也设置为0.

我已经实现了setItemSize(QSizeF sz)(以像素为单位的sz),QGraphicsTextItem根据需要调整大小.
使用项目边界rect初始化sz.
假设没有换行,单行文本(解决此问题后可以单独解决多行).

将项目添加到画布时,我仍然会看到顶部和底部边距 - 这会根据字体选择而有所不同.
我在项目周围画了一个矩形来看它.
顶部/底部距离取决于字体选择.


我曾尝试使用字体指标来确定这些距离(paint()我在绘制线条时试图确定文本适合的位置和矩形).

我很乐意至少能够确定用于大写字母,没有重音符号或特殊字符字体的正确大小(这将是一个开始,但自然我需要能够使用任何字符).
但至少有一些方法可以确定文本内容的大小和位置(相对于项目的(0,0)),即使在最简单的情况下......

字体度量tightBoundingRect()似乎是最准确的大小,但似乎无法确定其位置,以便我可以以某种方式正确创建我的项目,并可能正确调整大小/移动它们以适应画布.


以下是我努力确定至少相对于项目的(0,0)的文本的确切大小和位置的一些示例(假设一旦我这样做,我能够将该信息暴露给外部或包括班次在项目转换调整大小).
请注意,字体度量标注的文本大小并不总是覆盖文本,对于不同的字体,我无法在文本本身周围放置紧束缚矩形(洋红色).(我做了多次猜测,下面的代码只有一个 - 这些行试图显示不同的字体指标大小).

在此输入图像描述

以上是继承文本项的绘画功能的实验QGraphicsTextItem:

void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget)
{
    // draw text
    QGraphicsTextItem::paint(painter, option, widget);

    QPen p;
    p.setWidthF(0);
    QFontMetricsF fm(this->font());
    qreal ascent = fm.ascent(),
          descent = fm.descent(), …
Run Code Online (Sandbox Code Playgroud)

qt qtextdocument qgraphicstextitem

6
推荐指数
1
解决办法
2470
查看次数

如何访问QTextDocument的QUndoStack?

我如何可以访问QUndoStackQTextDocument

(例如,我希望能够将自定义QUndoCommand对象添加到文档的撤消堆栈中)

c++ qt undo undo-redo qtextdocument

5
推荐指数
1
解决办法
856
查看次数

从QTextEdit中删除一行/块

我正在努力解决阻塞/线路移除问题QTextEdit.下面的代码应该(?)工作,但它最终会出现无限循环,因为某些未知的原因.如果正在编辑,我怀疑next()并且previous()不受欢迎QTextDocument.

QTextBlock block = document()->begin();
while (block.isValid()) {
    if (to_do_or_not_to_do(block)) {
        QTextCursor cursor(block);
        cursor.select(QTextCursor::BlockUnderCursor);
        cursor.removeSelectedText();
    }
    block = block.next();
}
Run Code Online (Sandbox Code Playgroud)

QTextDocument::findBlockByNumber()与上面相同的方式迭代使用和删除块也没有用.

如果有人可以指出我如何迭代所有块并在需要时删除它们,我将不胜感激.

PS
在我的特定情况下,一个块=一行.
Qt 4.6.2,Ubuntu 10.04 x64

qt qtextedit qtextdocument

5
推荐指数
1
解决办法
6780
查看次数

Qt - 几个QTextBlock内联

是否可以在一个水平线中在QTextDocument中排列几个QTextBlock?

我需要知道单击了哪个文本块,并且由于其方法setUserState(int),QTextBlock很好用,它可用于保存特定块的id.有更好的方法吗?

qt qtextdocument

5
推荐指数
1
解决办法
572
查看次数

如何使QTextTable覆盖整个文档宽度

我试图使 QTextDocument 内的 QTextTable 具有文档的 100% 或全宽。但是 QTextTableFormat 类中没有方法将 QTextTable 格式化为 100% 宽度。我们可以调整行和列的大小,但不能调整整个表格的大小。

有什么办法可以实现这一点,如果你知道怎么做,请分享。谢谢

python pyqt qtextdocument python-3.x pyqt5

5
推荐指数
1
解决办法
1055
查看次数

QTextEdit 中的自定义文本(代码)区域

我有兴趣创建一个行为类似于代码区域的文本对象类型(继承QTextObjectInterface):

  • 独特的背景
  • 边界
  • 等宽字体
  • 可编辑的内容
  • 实例需要可识别代码,以便可以提取其中的内容(将代码与周围的内容分开)
  • 保存/加载(来自常规 html 文件)
  • 语法高亮将是一个加号,但并不是真正必需的

文档的其他区域需要以通常的方式运行(字体属性可编辑、颜色可编辑等)。


Qt 提供了一个使用QTextEdit实现自定义文本对象的示例。这看起来很难,因为新的文本对象不能使用 QTextEdit / QTextDocument中的现有基础结构

QTextObject

可以将QTextDocument 的各个部分组合在一起的不同类型对象的基类

所以继承它可能是一种选择,但它在 Qt SDK 包中的源文件和谷歌搜索都没有透露有用的信息。

QTextFrame继承了QTextObject,因此,如果要找到有关此路径的一些提示,它可能是一个可行的基类。


在一个简单的 HTML 文件中,所有这些(语法高亮除外)都很容易。QTextEdit以 html 为输入,能够导出 html,但在此过程中会丢失结构。

<code class="code-sample">
  int i = 0;
</code>
Run Code Online (Sandbox Code Playgroud)

顺便说一下,QWebView是只读的。它的广告是:

HTML 文档的一部分可以是可编辑的,例如通过 HTML 元素上的 contenteditable 属性。


可能还有其他平台可以轻松使用,但是文本编辑器需要作为插件在Qt Creator 内部使用,所以使用Qt 框架是有意义的。

底线:如何在QTextEdit小部件中实现代码区域?


后期编辑:

  • 使用主干中的 Qt sdk(将自身标识为 4.8.4)
  • 主干中的 Qt …

c++ qt custom-controls qtextedit qtextdocument

4
推荐指数
1
解决办法
2675
查看次数

如何确定QTextDocument的高度?

给定一个特定的宽度,我想找出一个高度QTextDocument.换句话说,如果QTextEdit包含宽度QTextDocumentw的那么,为了在不需要滚动条的情况下完全显示文档,它的最小高度h是多少?

qt qt4 qtextedit qtextdocument

2
推荐指数
1
解决办法
2192
查看次数

QTextDocument HTML表格宽度

我正在努力解决QT5问题。我正在尝试构建(然后在QPainter对象上绘制)HTML表。这是我的代码:

QTextDocument td;
QString table_style= QString("<style type=\"text/css\">"
                             ".tg  { table-layout: fixed; width: 200px; }"
                             ".tg td{padding-bottom: 5px;border-style:solid;border-width:0px;}"
                             ".tg .tg-3x1q{color: rgba(255, 255, 255, 0.5); text-align:right}"
                             ".tg .tg-6bqv{color: rgba(255, 255, 255, 0.5); padding-left: 5px;}"
                             "</style>");

QString table_html = QString(" <table width=\"500px\" class=\"tg\">"
                             "<tr>"
                               "<td class=\"tg-3x1q\" width=\"150px\">1</td>"
                               "<td class=\"tg-6bqv\" width=\"150px\"><sup>th</sup></td>"
                             "</tr>"
                             "<tr>"
                               "<td class=\"tg-3x1q\" width=\"150px\">2</td>"
                               "<td class=\"tg-6bqv\" width=\"150px\"><sup>rpm</sup></td>"
                             "</tr>"
                             "<tr>"
                               "<td class=\"tg-3x1q\" width=\"150px\">3</td>"                   
                               "<td class=\"tg-6bqv\" width=\"150px\"><sup>km/h</sup></td>"
                             "</tr>"
                             "</table>");

td.setDefaultStyleSheet(table_style);
td.setHtml(table_html);
td.drawContents(painter);
Run Code Online (Sandbox Code Playgroud)

该表正确显示在画家中,但没有固定的列宽。为了达到该结果,我几乎尝试了所有方法:

  • 不支持table-layout: fixedQT的文档中进行设置,但支持该功能(但宽度为!)
  • 设置width带或不带双引号(相对或绝对) …

html qt qtextdocument

1
推荐指数
1
解决办法
2340
查看次数