是否可以在一条水平线中在QTextDocument中排列多个QTextBlock?
由于其方法setUserState(int),我需要知道单击了哪个文本块并且QTextBlock会很好用,它可用于保存特定块的id。有更好的方法吗?
答案 0 :(得分:1)
不确定我的问题是否正确,但是我正在研究它(问题问题后三年左右......)
原则上,您可以使用QTextBlocks
将QTextTable
放在水平线上。如果您随后创建了一个继承自QTextEdit
的类,则可以捕获鼠标事件并找出单击的文本块。
我在下面发布了一些代码,其中有一个非常简单的对话框,其中只有一个textedit(上面提到的派生类)。我创建一个表格,在水平线上布置三个文本块,并将其用户状态设置为列号。然后我只使用重载的mouseEvent
方法来创建文本编辑类,该方法只打印它所在的任何文本块的userState
到命令行,只是为了显示原理。
如果这有任何帮助或误解了您的问题,请告诉我。
<强> dialog.h 强>
#ifndef MYDIALOG_H
#define MYDIALOG_H
#include "ui_dialog.h"
class MyDialog : public QDialog, public Ui::Dialog
{
public:
MyDialog(QWidget * parent = 0, Qt::WindowFlags f = 0);
void createTable();
};
#endif
<强> dialog.cpp 强>
#include "dialog.h"
#include <QTextTable>
#include <QTextTableFormat>
MyDialog::MyDialog(QWidget * parent, Qt::WindowFlags f) :
QDialog(parent,f)
{
setupUi(this);
}
void MyDialog::createTable()
{
QTextCursor cursor = textEdit->textCursor();
QTextTableFormat tableFormat;
tableFormat.setCellPadding(40);
tableFormat.setBorderStyle(QTextFrameFormat::BorderStyle_None);
QTextTable* table=cursor.insertTable(1,3,tableFormat);
for( int col = 0; col < table->columns(); ++col ) {
cursor = table->cellAt(0, col).firstCursorPosition();
cursor.insertBlock();
cursor.block().setUserState(col);
cursor.insertText(QString("Block in Column ")+QString::number(col));
}
}
<强> mytextedit.h 强>
#ifndef MYTEXTEDIT_H
#define MYTEXTEDIT_H
#include <QTextEdit>
class MyTextEdit : public QTextEdit
{
public:
MyTextEdit(QWidget * parent = 0);
void mousePressEvent(QMouseEvent *event);
};
#endif
<强> mytextedit.cpp 强>
#include "mytextedit.h"
#include <QMouseEvent>
#include <QTextBlock>
#include <QtCore>
MyTextEdit::MyTextEdit(QWidget * parent) :
QTextEdit(parent)
{
}
void MyTextEdit::mousePressEvent(QMouseEvent *event)
{
if(event->button() == Qt::LeftButton) {
qDebug() << this->cursorForPosition(event->pos()).block().userState();
}
}
main.cpp (仅为完整性)
#include <QApplication>
#include "dialog.h"
int main(int argc, char** argv)
{
QApplication app(argc,argv);
MyDialog dialog;
dialog.show();
dialog.createTable();
return app.exec();
}