我正在使用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) 我正在尝试在我正在编写的编辑器中实现简单的文本搜索。一切都很好,直到出现这个问题!我正在尝试在这里实现向后搜索。过程是:向后查找主题,如果没有找到,蜂鸣一声,如果再次按下查找按钮,则到文档末尾,重新进行查找。“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,这意味着失败。这怎么会失败?!!提前致谢。
问题:我想为带有附加标签的文本实现文本编辑小部件.我希望某些标签在某些情况下不可见,这样它们就不会分散用户的注意力.
环境:我正在使用PyQt
并且更喜欢使用QPlainTextWidget
和QSyntaxHighlighter
.
方法:用QSyntaxHighlighter
我可以设置QTextCharFormat
为符合我的要求,该字符串.QTextCharFormat
给了我所有字体属性,如大小,颜色等,但是:我没有找到隐藏文本或将其大小减小到零的选项.
我不想删除或替换标签,因为这会引入更多代码(复制应该包含标签,而不能QSyntaxHighlighter
用于根据标签格式化剩余的文本).
更新:到目前为止,我发现了一个丑陋的黑客.通过将QTextFormat :: FontLetterSpacing设置为较小的值,文本将占用越来越少的空间.与透明色相结合,文字就像隐形.
问题:在我的测试中,这仅适用于低至0.016%的字母间距.间距下方重置为100%.
我需要一个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)
有解决方案吗
非常感谢.
我想创建一个具有正确样式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 …
我需要创建具有文本内容的确切宽度和高度的文本项.
文本的高度是最重要的要求.
文本的位置应该与文本本身相关.
我还必须能够将它放在画布上的确切位置.
假设一个(可打印的)画布(在一个更大的画布上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) 我如何可以访问QUndoStack
的QTextDocument
?
(例如,我希望能够将自定义QUndoCommand
对象添加到文档的撤消堆栈中)
我正在努力解决阻塞/线路移除问题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
是否可以在一个水平线中在QTextDocument中排列几个QTextBlock?
我需要知道单击了哪个文本块,并且由于其方法setUserState(int),QTextBlock很好用,它可用于保存特定块的id.有更好的方法吗?
我试图使 QTextDocument 内的 QTextTable 具有文档的 100% 或全宽。但是 QTextTableFormat 类中没有方法将 QTextTable 格式化为 100% 宽度。我们可以调整行和列的大小,但不能调整整个表格的大小。
有什么办法可以实现这一点,如果你知道怎么做,请分享。谢谢
我有兴趣创建一个行为类似于代码区域的文本对象类型(继承QTextObjectInterface):
文档的其他区域需要以通常的方式运行(字体属性可编辑、颜色可编辑等)。
Qt 提供了一个使用QTextEdit实现自定义文本对象的示例。这看起来很难,因为新的文本对象不能使用 QTextEdit / QTextDocument中的现有基础结构。
可以将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小部件中实现代码区域?
后期编辑:
给定一个特定的宽度,我想找出一个高度QTextDocument
.换句话说,如果QTextEdit
包含宽度QTextDocument
为w的那么,为了在不需要滚动条的情况下完全显示文档,它的最小高度h是多少?
我正在努力解决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: fixed
从QT的文档中进行设置,但支持该功能(但宽度为!)width
带或不带双引号(相对或绝对) …