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

时间:2018-08-03 17:48:30

标签: c++ qt qt5 qtextedit qlabel

我有一个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”的标签,但是上面的代码使该标签绘制在屏幕的右下角。

1 个答案:

答案 0 :(得分:1)

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

三思而后行,我得出一个结论,即OP的解决方案也应该起作用(尽管可能会有一些限制,可能会接受,也可能无法接受)。

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

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

不是OP打算做什么。

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

对于OP打算执行的操作,必须改为QTextEdit::textCursor()。不过,我在QTextCursor中找不到返回所需视图坐标的任何内容。

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

在适应OP的代码后,我意识到了另一个问题:

update()中调用TextEdit::TextEdit()似乎是为了获取文本光标的正确视图坐标。 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)

使用以下窗口:

snapshot of testQTextEditWithQLabel

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