在 qtextedit 中的文本后绘制一个 qlabel

draw a qlabel after text in qtextedit

我有一个 QTextEdit,我想在其中写一些文本,然后是一个 QLabel,就像这样

"Blah blah" [Label text]

我的想法是先写文字,用moveCursor函数将光标移动到文档末尾,然后在当前光标位置绘制标签,如

append("Blah blah");
moveCursor(QTextCursor::End);
label->move(cursor().pos());

然而,标签显示在编辑器的左上角。如何让标签在上面的文字之后绘制?

为了更清楚一点,请考虑

class myTextEdit::QTextEdit{
    explicit myTextEdit(QWidget* parent=0):
    QTextEdit(parent){
        append("blah blah ");
        update();
        auto l=new QLabel(this);
        l->setText(QString("label text"));
        l->setVisible(true);
        moveCursor(QTextCursor::End);
        l->move(cursor().pos());
        l->update();
}

我希望输出为 "blah blah",紧接着是一个显示 "label text" 的标签,但是上面的代码导致标签被绘制在屏幕的最右下角。

出于好奇,我从 google 开始,在 Qt 论坛中找到了 Put QWidget in a QTextEdit

三思而后行,我得出的结论是 OP 的解决方案也应该有效(尽管可能会有一些限制,这些限制可能是可接受的,也可能是不可接受的)。

然后我意识到OP犯了一个严重的错误:

l->move(cursor().pos());

不是 OP 打算做的。

cursor() 被继承,实际上是 QWidget::cursor() 返回此小部件的鼠标光标。

对于 OP 打算做的事情,它必须 QTextEdit::textCursor() instead. Though, I couldn't find anything in QTextCursor 返回所需的视图坐标。

相反,我发现 QTextEdit::cursorRect()(的两个变体)我认为是最有希望的候选人。

摆弄OP的代码,又发现一个问题:

TextEdit::TextEdit() 中调用 update() 似乎是为了获得文本光标的正确视图坐标。 QWidget::update() 除了请求(重新)绘制之外没有别的。 (调试我的示例代码再次批准它:我总是 0, 0 作为位置。)

我还在纠结什么时候可用的布局细节。某些事情是在事件中完成的。因此,在事件循环开始之前(在 QApplication::exec() 中)不可能请求正确的值。然而,在某些情况下,一个简单的 show() 就足以确保正确的值——尤其是在布局方面。

然而,在被提醒之后,我重新整理了一下代码,最终得到了我认为 OP 打算做的事情。

testQTextEditWithQLabel.cc:

#include <QtWidgets>

int main(int argc, char *argv[])
{
  QApplication app(argc, argv);
  QTextEdit qTextEdit;
  qTextEdit.append("OP said: blah blah ");
  qTextEdit.show();
  QLabel qLbl(QString("label text"), &qTextEdit);
  qTextEdit.moveCursor(QTextCursor::End);
  const QRect qRect = qTextEdit.cursorRect();
  qDebug() << "Rect:" << qRect;
  qLbl.show();
  qLbl.move(qRect.left(), qRect.top());
  return app.exec();
}

testQTextEditWithQLabel.pro:

SOURCES = testQTextEditWithQLabel.cc

QT += widgets

在 Windows 10 上 cygwin(64 位)编译和测试:

$ qmake-qt5 

$ make
g++ -c -fno-keep-inline-dllexport -D_GNU_SOURCE -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I. -isystem /usr/include/qt5 -isystem /usr/include/qt5/QtWidgets -isystem /usr/include/qt5/QtGui -isystem /usr/include/qt5/QtCore -I. -I/usr/lib/qt5/mkspecs/cygwin-g++ -o testQTextEditWithQLabel.o testQTextEditWithQLabel.cc
g++  -o testQTextEditWithQLabel.exe testQTextEditWithQLabel.o   -lQt5Widgets -lQt5Gui -lQt5Core -lGL -lpthread 

$ ./testQTextEditWithQLabel
Rect: QRect(116,4 1x14)

与以下 window:

我不太确定当滚动起作用时这将如何协同工作,但这可能是也可能不是 OP 的问题。