добрый день! есть вопрос:
как сделать чтобы если в QTextEdit'е ввели символ { или : и нажали Enter, то курсор перемещается не в начало следующей строки, а на следующую строку и под этим символом?
заранее большое спасибо!
Примерно так:
#include <QtGui/QApplication>
#include <QTextEdit>
#include <QKeyEvent>
class CTextEdit: public QTextEdit
{
public:
CTextEdit( QWidget *pParent = 0);
protected:
virtual bool event( QEvent *pEvent);
};
CTextEdit::CTextEdit( QWidget *pParent):QTextEdit( pParent)
{
}
bool CTextEdit::event( QEvent *pEvent)
{
if( pEvent->type() == QEvent::KeyPress)
{
QKeyEvent *pKeyEvent = static_cast<QKeyEvent *>(pEvent);
if( pKeyEvent->key() == Qt::Key_Return)
{
QString szText = toPlainText();
if( szText.right( 1)=="{" || szText.right( 1)==":")
{
insertPlainText( "\r\n-->");
return true;
}
}
}
return QTextEdit::event( pEvent);
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
CTextEdit te;
te.show();
return a.exec();
}
Тебе осталось только получить расстояние до "{" или ":" и заменить --> на него...
1)QTextEdit::toPlainText() по-моему получает весь текст из области, можно ли как-то получать только одну данную линию текста?
2)в моем случае скорее надо вместо QString::right() использовать QString::left(), т.к. когда Ентер нажат, то символ уже введен...
3)может проще сделать через keyPressEvent?
вообще, пример того, что я хочу сделать - есть в любой IDE, но я чего-то путаюсь с передвиганием курсора
Критика конечно же обоснована, но я это набросал как пример для наглядности того, как сделать то, что ты хочешь. Потому оптимизацией занимайся как-нибудь сам...
Получить позицию можно так:
int n1 = pTextEdit->textCursor().blockNumber();
int n2 = pTextEdit->textCursor().columnNumber();
ладно, чуть позже еще пошаманю над этим
ViGOur, и все-таки можно ли как-то получить только последнюю строку или, что еще лучше, символ, а не весь текст, как здесь у тебя:
QString szText = toPlainText();
уррряя! получилось большое спасибо!
выкладываю код, может кому еще понадобится:
void TextEdit::keyPressEvent(QKeyEvent *keyEvent) {
if(keyEvent->key() == Qt::Key_Return) {
QString text = toPlainText();
if((text.right(1) == "{") || (text.right(1) == ":")) {
int n = textCursor().columnNumber();
insertPlainText("\n");
for(int i=0; i < n; ++i) insertPlainText(" ");
return;
}
}
QTextEdit::keyPressEvent(keyEvent);
}
немного усовершенствовал:
void TextEdit::keyPressEvent(QKeyEvent *keyEvent) {
if(keyEvent->key() == Qt::Key_Return) {
QString text = toPlainText();
if((text.right(1) == "{") || (text.right(1) == ":")) {
n = textCursor().columnNumber();
insertPlainText("\n");
for(int i=0; i < n; ++i) insertPlainText(" ");
return;
}
if(text.right(1) == "}") {
if(n) {
n=0;
QTextEdit::keyPressEvent(keyEvent);
}
}
if(n) {
insertPlainText("\n");
for(int i=0; i < n; ++i) insertPlainText(" ");
return;
}
}
QTextEdit::keyPressEvent(keyEvent);
}
Для того чтобы получить текущию строку :
QTextBlock Block = textCursor().block();
const QString sText = Block.text();
Red Devil, большое спасибо, то что нужно
Добрый вечер, изучаю работу с файлами в QT Creator, стоит такая задача: в файл записываются: марка мобильного телефона, вес в граммах и цена. пользователь задаёт минимальную и максимальную цены и на экран должны вывестись телефоны, цены которых входят в заданный промежуток, как можно осуществить данную сортировку с использованием QTextCursor, вот, допустим, вывод у меня осуществляется в таком формате: sony3s22rw|500|10000|, я выгружаю всю информацию из файла в текст эдит, заставляю элемент типа QTextCursor искать в строке каждый второй символ "|", а как вот дальше заставить его переместиться наследующую позицию и выделить слово? И сразу вопрос, можно ли выделенную часть переводить в число и проверять на соответствие условию, в Delphi вроде бы так можно было делать, не приходилось особо это затрагивать, когда работала там, а вот тут что-то пришлось.
Может не стоит мучиться с файлами? Чем sqlite не угадила?
А вместо QTextEdit использовать таблицу, например QTableView.
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)