Qt - несколько встроенных QTextBlock
Можно ли расположить несколько QTextBlocks в QTextDocument в одну горизонтальную линию?
Мне нужно знать, какой блок текста был нажат, и QTextBlock было бы неплохо использовать из-за его метода setUserState(int), который можно использовать для хранения идентификатора определенного блока. Есть ли лучшие подходы?
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();
}