syncronisation des cursors von 2 qtextedit

Alles rund um die Programmierung mit Qt
Antworten
Linuxguru
Beiträge: 96
Registriert: 14. Januar 2007 02:09

syncronisation des cursors von 2 qtextedit

Beitrag von Linuxguru »

hallo,

wie schon erwähnt. gibt es eine möglichkeit die vertikale cursorposition eines qtextedits auf einen anderenzu übertragen?

wenn ich bei textedit2 die position ändere, dann soll die position auf textedit1 gesetzt werden.

ich brauch nur die position der reihe, nicht der spalte.

danke :-)
Flachkoepper
Beiträge: 149
Registriert: 11. Januar 2005 12:14
Wohnort: Hannover

Beitrag von Flachkoepper »

Ein bisschen mehr Einsatz kann man ja wohl erwarten, oder? 10 Sekunden in der Doku zu QTextEdit haben bei mir folgende Stichwörter gebracht:

Code: Alles auswählen

void cursorPositionChanged ();
QTextCursor textCursor () const;
int QTextCursor::position () const;
Damit sollte doch was anzufangen sein, oder?
zwutz
Beiträge: 14
Registriert: 20. November 2007 09:13

Beitrag von zwutz »

ich frag mich eher, obs da nicht Probleme bezüglich des Focus gibt...
Flachkoepper
Beiträge: 149
Registriert: 11. Januar 2005 12:14
Wohnort: Hannover

Beitrag von Flachkoepper »

Hmm, da hast du natürlich recht, soweit habe ich noch gar nicht gedacht. Zwei Widgets, die zur selben Zeit den Cursor haben, könnte in der Tat schwierig werden...
Sorry!
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Ich versteh zwar jetzt den Sinn von 2 Cursorn(?) nicht, aber es ist doch ganz einfach. Nur das Widget, daß den Focus hat, darf die Cursorposition an das andere Widget weitergeben. Die notwendigen Funktionen dazu wurden ja schon genannt.
Linuxguru
Beiträge: 96
Registriert: 14. Januar 2007 02:09

Beitrag von Linuxguru »

hallo,

in der hilfe hab ich natürlich schon geschaut. das problem wird vermutlich am focus liegen.

der hintergrund meines vorhabens.

ich hab 2 textedit. in beiden objekten werden die zeilen syncron mit text gefüllt.
das funktioniert auch so weit ganz gut. wenn die texteditzeilen im sichtbaren bereich gefüllt sind,
erscheint auf beiden seiten eine scrollbar.

nun sollte es praktisch so verlaufen, wenn ich im textedit2 mit dem cursor nach oben gehe, sich die scrollbar demnach auch nach oben verschiebt, dann sollte das im textedit1 auch so sein. das heisst, ich muss mich auf beiden seiten immer in der selben zeile befinden, darf aber nur im textedit2 zeilen schreiben.

danke :-)
Linuxguru
Beiträge: 96
Registriert: 14. Januar 2007 02:09

Beitrag von Linuxguru »

hallo,

ich hab nun eine teillösung, die ansatzweise das macht was ich vorhab.

hier mal mein code:

Code: Alles auswählen


MyTextEdit::MyTextEdit( QWidget* parent )
  : QWidget( parent )
{
	QHBoxLayout *editLayout = new QHBoxLayout(this);
	editLayout->setMargin(0);

	lineNumber = new QTextEdit;
	lineNumber->setMaximumWidth(50);
	lineNumber->setStyleSheet( "border: 0px solid black" );
	lineNumber->setText("1");
	lineNumber->setAlignment( Qt::AlignRight );
	lineNumber->verticalScrollBar()->setVisible( false );
	lineNumber->setEnabled( false );
	edit = new QTextEdit;
	edit->setStyleSheet( "border: 0px solid black" );
	output = new QLineEdit;
	

	editLayout->addWidget(lineNumber);
	editLayout->addWidget(edit);
	editLayout->addWidget(output);

	connect( edit->document(), SIGNAL(contentsChange(int,int,int)), this, SLOT(textChanged(int,int,int)) );
	connect( edit, SIGNAL(cursorPositionChanged()), this, SLOT(sliderPosition1()) );
	connect( edit->verticalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(sliderPosition(int)) );
}

void MyTextEdit::sliderPosition(int)
{
	int pos1 = lineNumber->verticalScrollBar()->value();
	int pos2 = edit->verticalScrollBar()->value();
	lineNumber->verticalScrollBar()->setRange( 0,65535 );
	edit->verticalScrollBar()->setRange( 0,65535 );
	lineNumber->verticalScrollBar()->setSliderPosition( pos2 );
	output->setText( QString::number(pos1)+" - "+QString::number(pos2) );
}

void MyTextEdit::sliderPosition1()
{
	int pos1 = lineNumber->verticalScrollBar()->value();
	int pos2 = edit->verticalScrollBar()->value();
	lineNumber->verticalScrollBar()->setRange( 0,65535 );
	edit->verticalScrollBar()->setRange( 0,65535 );
	lineNumber->verticalScrollBar()->setSliderPosition( pos2 );
	output->setText( QString::number(pos1)+" - "+QString::number(pos2) );
}


der scrollt nun das linenumbertextedit automatisch mit, wenn ich das edittextedit scrolle oder den cursor verschiebe.

allerdings hab ich die sliderrange statisch festlegen müssen, da mir keine andere lösung bekannt ist. das macht natürlich auch den greifer der scrollbar klein, sobald sie sichtbar wird.

kann mir evtl noch jemand sagen, wie sich der greifer der scrollbar besser anpassen lässt, sodass ich auch nur in dem textdocument scrollen kann, die auch schon sichtbar sind??

danke ;-)
Antworten