我有一个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”的标签,但是上面的代码使该标签绘制在屏幕的右下角。
答案 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)
使用以下窗口:
我不太确定滚动开始时这将如何协同工作,但这可能不是OP的问题。