Название: Qtextedit + перенос на следующую строку
Отправлено: jatsuk от Февраля 04, 2012, 08:29
Есть textedit, заполненный html кодом... Есть слот br, который вставлет тег <br> по нажатию qpushbutton
int pos; QString rt; pos = ui->textEdit->textCursor().selectionStart(); rt = ui->textEdit->textCursor().selectedText(); ui->textEdit->textCursor().setPosition(pos); ui->textEdit->textCursor().insertText(rt+"<br>");
Надо, чтобы по нажатию клавиши Enter вставлялся тег <br> в textedit и переносило на следующую строку.
Привязал слот к Qshortcut ... ui->br1->setShortcut(Qt::Key_Return);
Получилось так, захожу в программу - нажимаю Enter, вставляется <br>, всё ок... Но если выбрать курсором textedit, то по Enter просто переносит на следующюю строку и для вставки br приходится нажимать руками на слот, а хотелось бы именно на Enter... Есть какая нибудь возможность сделать так ?
Название: Re: Qtextedit + перенос на следующую строку
Отправлено: kambala от Февраля 04, 2012, 13:21
унаследуйся от QTextEdit и переопредели keyPressEvent(): C++ (Qt) void MyTextEdit::keyPressEvent(QKeyEvent *e) { if (e->key() == Qt::Key_Return || e->key() == Qt::Key_Enter) insertPlainText("<br>"); QTextEdit::keyPressEvent(e); }
Название: Re: Qtextedit + перенос на следующую строку
Отправлено: jatsuk от Февраля 04, 2012, 14:49
Спасибо, думал обойдется без унаследования, ну да ладно буду разбираться )
И ещё такой вопрос.
TextEdit не хочет отображаться отступ текста от картинки.... не знаю почему вставляю тег <img src="simp.png" hspace=7 vspace=7 align=left> и отступы не реагирует никак... тест липнет к картинке
Пробовал менять hspace=7 vspace=7 ничего не изменяется. Через ковычки hspace="7" vspace="7" - тоже не работает. В текстброузере попробовал - тоже самое. я уже и пиксели ставил и кавычки :'( В чем может быть проблема ?
Название: Re: Qtextedit + перенос на следующую строку
Отправлено: kambala от Февраля 04, 2012, 15:56
QTextEdit как-то плохо реагирует на выравнивание. у меня еле получилось заставить отображаться текст по центру через одноклеточную таблицу, и то - это начинает работать только если виден вертикальный скролл или после того, как изменить размер, - по умолчанию всегда выравнивается налево.
Название: Re: Qtextedit + перенос на следующую строку
Отправлено: jatsuk от Февраля 04, 2012, 16:11
QTextEdit как-то плохо реагирует на выравнивание. у меня еле получилось заставить отображаться текст по центру через одноклеточную таблицу, и то - это начинает работать только если виден вертикальный скролл или после того, как изменить размер, - по умолчанию всегда выравнивается налево.
Ну само обтекание тестом работает, а вот отступ нет ( А что посоветуете использовать вместо textedit ?
Название: Re: Qtextedit + перенос на следующую строку
Отправлено: kambala от Февраля 04, 2012, 17:51
можно конечно QWebView попробовать, но это даст лишнюю зависимость
Название: Re: Qtextedit + перенос на следующую строку
Отправлено: jatsuk от Февраля 05, 2012, 05:52
Сделал как посоветовали... (про клавишу enter)
Добавил в mainwinows.cpp
void MyTextEdit::keyPressEvent(QKeyEvent *e) { if (e->key() == Qt::Key_Return || e->key() == Qt::Key_Enter) insertPlainText("<br>"); QTextEdit::keyPressEvent(e); }
а в заголовочном файле mainwinows.h
class MyTextEdit : public QTextEdit { protected: void keyPressEvent ( QKeyEvent * e ); };
На нажатие клавиш не реагирует (по прежнему просто переносит на следующую строку)... Проверял через отладку в функцию void MyTextEdit даже не заходит 4 часа читал форум, думал я где то ошибся.... вроде всё нормально Почему не реагирует то ? может я какой то момент упустил ?
Название: Re: Qtextedit + перенос на следующую строку
Отправлено: Bepec от Февраля 05, 2012, 08:47
Людиии... Событие KeyPressEvent - нажатие клавиши, которое вызывается после (ПОСЛЕ) произошедшего события.
Чтобы заменить нажатие Enter, вам нужно поставить фильтр на события. И далее заменять 1 евент на другой.
Название: Re: Qtextedit + перенос на следующую строку
Отправлено: kambala от Февраля 05, 2012, 13:28
Проверял через отладку в функцию void MyTextEdit даже не заходит
а класс-то ты своему текстэдиту заменил на этот новый? Событие KeyPressEvent - нажатие клавиши, которое вызывается после (ПОСЛЕ) произошедшего события.
пока ты не вызовешь реализацию базового класса, ничего не произойдёт
Название: Re: Qtextedit + перенос на следующую строку
Отправлено: Bepec от Февраля 05, 2012, 22:46
Кхм, проще говоря переопределив KeyPressEvent и оставив его пустым, я убью все стандартные нажатия? сомнительно.
Название: Re: Qtextedit + перенос на следующую строку
Отправлено: kambala от Февраля 06, 2012, 02:05
когда сомневаешься, можно просто взять и попробовать. C++ (Qt) #include <QApplication> #include <QTextEdit> #include <QKeyEvent> class TextEdit : public QTextEdit { protected: void keyPressEvent(QKeyEvent *e) {} }; int main(int argc, char **argv) { QApplication a(argc, argv); TextEdit *te = new TextEdit; te->show(); return a.exec(); }
Название: Re: Qtextedit + перенос на следующую строку
Отправлено: jatsuk от Февраля 10, 2012, 08:20
В общем получилось кое-что , а кое-что нет (
kambala правильно предположил, что я не поменял класс у своего виджета...
Если просто в mainwindows.cpp создать textedit, но уже с классом MyTextEdit, а не Qtextedit, то всё нормально. Работает, по кнопке enter вставляются тег <br> и переносится на новую строку.
MyTextEdit *te = new MyTextEdit; te->show();
Но этот te создается поверх окна, а нужно, чтобы это происходило уже с существующим textEdit. Но как поменять класс этого виджета , который вставлен через designer?? Пробовал через правую кнопку на виджет - преобразовать в ... Ввел имя MyTextEdit и заголовочный файл mainwindows.h В файле ui_mainwindows.h класс MyTextEdit
textEdit = new MyTextEdit(tab); textEdit->setObjectName(QString::fromUtf8("textEdit")); textEdit->setGeometry(QRect(10, 100, 491, 351)); textEdit->setFrameShape(QFrame::StyledPanel); textEdit->setReadOnly(false);
Но выдает кучу ошибок про этот класс...
Название: Re: Qtextedit + перенос на следующую строку
Отправлено: Bepec от Февраля 10, 2012, 08:41
Эм... лучше код, чем скриншот ;)
Название: Re: Qtextedit + перенос на следующую строку
Отправлено: jatsuk от Февраля 10, 2012, 08:45
Код слишком огромный уже... ) но попробую закоментить всё ненужное
Название: Re: Qtextedit + перенос на следующую строку
Отправлено: jatsuk от Февраля 10, 2012, 08:56
mainwindows.h #ifndef MAINWINDOW_H #define MAINWINDOW_H
...
namespace Ui { class MainWindow; }
class MainWindow : public QMainWindow { Q_OBJECT
public: MainWindow(QWidget *parent = 0); ~MainWindow(); QSqlDatabase db;
...
private: Ui::MainWindow *ui;
public slots: .... };
class MyTextEdit : public QTextEdit { Q_OBJECT
protected: void keyPressEvent ( QKeyEvent * e ); };
#endif // MAINWINDOW_H mainwindows.cpp #include "mainwindow.h" #include "ui_mainwindow.h" #include <QtSql>
void MyTextEdit::keyPressEvent(QKeyEvent *e) { if (e->key() == Qt::Key_Return || e->key() == Qt::Key_Enter) { insertPlainText("<br>"); //QMessageBox::warning(this, tr("Ошибка"),tr("Сначала выделите строку"));
} QTextEdit::keyPressEvent(e); }
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this);
//конектятся слоты к сигналам и т.п
/* MyTextEdit *te = new MyTextEdit; te->setGeometry(QRect(10, 100, 491, 351)); te->show(); */
}
//много много слотов )
MainWindow::~MainWindow() { delete ui; }
ui_mainwindows.h #ifndef UI_MAINWINDOW_H #define UI_MAINWINDOW_H
//// #include <mainwindow.h>
QT_BEGIN_NAMESPACE
class Ui_MainWindow { public: QWidget *centralWidget; QTabWidget *tabWidget; QWidget *tab; QPushButton *add; MyTextEdit *textEdit;
// остальные виджеты
void setupUi(QMainWindow *MainWindow) { if (MainWindow->objectName().isEmpty()) MainWindow->setObjectName(QString::fromUtf8("MainWindow")); MainWindow->resize(930, 508); centralWidget = new QWidget(MainWindow); centralWidget->setObjectName(QString::fromUtf8("centralWidget")); tabWidget = new QTabWidget(centralWidget); tabWidget->setObjectName(QString::fromUtf8("tabWidget")); tabWidget->setGeometry(QRect(420, 0, 511, 481)); tab = new QWidget(); tab->setObjectName(QString::fromUtf8("tab")); add = new QPushButton(tab); add->setObjectName(QString::fromUtf8("add")); add->setGeometry(QRect(130, 10, 75, 23)); textEdit = new MyTextEdit(tab); textEdit->setObjectName(QString::fromUtf8("textEdit")); textEdit->setGeometry(QRect(10, 100, 491, 351)); textEdit->setFrameShape(QFrame::StyledPanel); textEdit->setReadOnly(false); textEdit->setHtml(QString::fromUtf8("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n" "<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n" "p, li { white-space: pre-wrap; }\n" "</style></head><body style=\" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;\">\n" "<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;\"></p></body></html>")); textEdit->setAcceptRichText(false);
retranslateUi(MainWindow);
tabWidget->setCurrentIndex(0);
QMetaObject::connectSlotsByName(MainWindow); } // setupUi
void retranslateUi(QMainWindow *MainWindow) { MainWindow->setWindowTitle(QApplication::translate("MainWindow", "\320\227\320\260\320\277\320\276\320\273\320\275\320\265\320\275\320\270\320\265 \320\260\320\275\320\260\320\273\320\270\320\267\320\276\320\262 1.0", 0, QApplication::UnicodeUTF8)); add->setText(QApplication::translate("MainWindow", "\320\224\320\276\320\261\320\260\320\262\320\270\321\202\321\214", 0, QApplication::UnicodeUTF8)); pro->setText(QApplication::translate("MainWindow", "\320\237\321\200\320\276\321\201\320\274\320\276\321\202\321\200", 0, QApplication::UnicodeUTF8)); clear_but->setText(QApplication::translate("MainWindow", "\320\236\321\207\320\270\321\201\321\202\320\270\321\202\321\214", 0, QApplication::UnicodeUTF8)); h1->setText(QApplication::translate("MainWindow", "h1", 0, QApplication::UnicodeUTF8)); h3->setText(QApplication::translate("MainWindow", "h3", 0, QApplication::UnicodeUTF8)); u->setText(QApplication::translate("MainWindow", "\321\207", 0, QApplication::UnicodeUTF8)); b->setText(QApplication::translate("MainWindow", "\320\266", 0, QApplication::UnicodeUTF8)); em->setText(QApplication::translate("MainWindow", "\320\272", 0, QApplication::UnicodeUTF8)); br1->setText(QApplication::translate("MainWindow", "br", 0, QApplication::UnicodeUTF8)); playsound->setText(QApplication::translate("MainWindow", "Play", 0, QApplication::UnicodeUTF8)); incimg->setText(QApplication::translate("MainWindow", "img", 0, QApplication::UnicodeUTF8)); table->setText(QApplication::translate("MainWindow", "table", 0, QApplication::UnicodeUTF8)); tabWidget->setTabText(tabWidget->indexOf(tab), QApplication::translate("MainWindow", "\320\240\320\265\320\264\320\260\320\272\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265", 0, QApplication::UnicodeUTF8)); label->setText(QApplication::translate("MainWindow", "\320\235\320\260\320\267\320\262\320\260\320\275\320\270\320\265", 0, QApplication::UnicodeUTF8)); textEdit_2->setHtml(QApplication::translate("MainWindow", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n" "<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n" "p, li { white-space: pre-wrap; }\n" "</style></head><body style=\" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;\">\n" "<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;\"></p></body></html>", 0, QApplication::UnicodeUTF8)); textEdit_3->setHtml(QApplication::translate("MainWindow", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n" "<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n" "p, li { white-space: pre-wrap; }\n" "</style></head><body style=\" font-family:'MS Shell Dlg 2'; font-size:10pt; font-weight:400; font-style:normal;\">\n" "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-size:8pt;\">\320\227\320\262\321\203\320\272\320\276\320\262\320\276\320\271 \321\204\320\260\320\271\320\273</span></p></body></html>", 0, QApplication::UnicodeUTF8)); playsound_2->setText(QApplication::translate("MainWindow", "Play", 0, QApplication::UnicodeUTF8)); tabWidget->setTabText(tabWidget->indexOf(tab_2), QApplication::translate("MainWindow", "\320\237\321\200\320\276\321\201\320\274\320\276\321\202\321\200", 0, QApplication::UnicodeUTF8)); checkBox->setText(QApplication::translate("MainWindow", "\320\220\320\262\321\202\320\276\320\276\320\261\320\275\320\276\320\262\320\273\320\265\320\275\320\270\320\265", 0, QApplication::UnicodeUTF8)); del->setText(QApplication::translate("MainWindow", "\320\243\320\264\320\260\320\273\320\270\321\202\321\214", 0, QApplication::UnicodeUTF8)); edit_but->setText(QApplication::translate("MainWindow", "\320\240\320\265\320\264\320\260\320\272\321\202\320\270\321\200\320\276\320\262\320\260\321\202\321\214", 0, QApplication::UnicodeUTF8)); ok_but->setText(QApplication::translate("MainWindow", "\320\237\320\276\320\264\321\202\320\262\320\265\321\200\320\264\320\270\321\202\321\214", 0, QApplication::UnicodeUTF8)); obntab->setText(QApplication::translate("MainWindow", "\320\236\320\261\320\275\320\276\320\262\320\270\321\202\321\214", 0, QApplication::UnicodeUTF8)); label_2->setText(QApplication::translate("MainWindow", "\302\251 2012 medjs.ru. \320\227\320\260\320\277\320\276\320\273\320\275\320\265\320\275\320\270\320\265 \320\260\320\275\320\260\320\273\320\270\320\267\320\276\320\262. v 1.0", 0, QApplication::UnicodeUTF8)); } // retranslateUi
};
namespace Ui { class MainWindow: public Ui_MainWindow {}; } // namespace Ui
QT_END_NAMESPACE
#endif // UI_MAINWINDOW_H
Название: Re: Qtextedit + перенос на следующую строку
Отправлено: kambala от Февраля 10, 2012, 13:25
Но как поменять класс этого виджета , который вставлен через designer?? Пробовал через правую кнопку на виджет - преобразовать в ... Ввел имя MyTextEdit и заголовочный файл mainwindows.h
это ты правильно сделал textEdit = new MyTextEdit(tab);
ошибка указывает на эту строку - тебе надо явно описать конструктор с параметром-виджетом в новом классе: C++ (Qt) ... public: MyTextEdit(QWidget *parent = 0) : QTextEdit(parent) {} ...
Название: Re: Qtextedit + перенос на следующую строку
Отправлено: jatsuk от Февраля 10, 2012, 15:18
;D заработало. спасибо огромное
|