QT Creator, zaznaczanie tekstu

0

Mam za zadanie wczytać określony blok wierszy do w gui z C++ (zrobione) z pliku .txt, a następnie wybrać określone współrzędne. Target jest taki, żeby nie zaznaczać tekstu całościowo, a żeby po kliknięciu określonego wiersza zaznaczało go całego (i odróżniało od kolumn, na przykład po spacji albo po dwóch spacjach, w zależności od konstrukcji .txt). Mógłby ktoś podpowiedzieć, od czego zacząć pracę nad tym albo dać dobry tutorial? Zależałoby mi na edycji tła zaznaczonego tekstu, do tego dodać podkreślenie (po kliknięciu prawym automatyczna jest opcja kopiowania, więc z tym nie ma problemu).

1

API jest proste i oczywiste, tylko poczytać i popróbować

edit1->moveCursor(QTextCursor::StartOfLine);
edit1->moveCursor(QTextCursor::EndOfLine, QTextCursor::KeepAnchor);

i masz zaznaczoną całą linię, w której pierwotnie był kursor.

0

W porządku, dzięki za pomoc. A jaki obiekt ma być podstawiony w miejsce "edit1", co tam zadeklarować? Co do dokumentacji, ciągle szlifuję jechanie na "czyściocha", bez przykładów ze stacka, ale niestety za krótko w tym siedzę. Mam taką funkcję, która ładuje plik z notatnika. Podkreśla faktycznie pierwszą linię (zresztą nie może być inaczej, skoro działanie jest podpięte do funkcji wczytującej plik). Nie wiem, jak zdefiniować akcję w taki sposób, żeby następowała zmiana linijki w momencie innego kliknięcia.


// konstruktor:

markSelection::markSelection(QWidget *parent)
	: QMainWindow(parent)
{
	ui.setupUi(this);
	connect(ui.actionOpen, SIGNAL(triggered()), this, SLOT(openSelectionWindow()));
}

void markSelection::loadFile(const QString& filePath)
{
	QFile file(filePath);

	if (!file.open(QFile::ReadOnly)) {
		QMessageBox::warning(this, tr("Recent Files Example"),
			tr("This file could not be found:\n%1.")
			.arg(filePath));
		return;
	}


	QTextStream in(&file);
	ui.textBrowser->setText(in.readAll());

	QPalette palette = ui.textBrowser->palette();
	palette.setColor(ui.textBrowser->backgroundRole(), Qt::yellow);
	palette.setColor(ui.textBrowser->foregroundRole(), Qt::yellow);
	ui.textBrowser->setPalette(palette);
	ui.textBrowser->setAutoFillBackground(true);

	ui.textBrowser->moveCursor(QTextCursor::StartOfLine);
	ui.textBrowser->moveCursor(QTextCursor::EndOfLine, QTextCursor::KeepAnchor);
}
0

Refresh

0

Może lepiej opisz jaką funkcjonalność realizujesz bo mi to wygląda na problem XY.
Z mojego doświadczenia zmiana ustawień kursora na kliknięcie przyniesie więcej problemów niż pożytku i zwykle oznacza to, nieprawidłowe wykorzystanie textEdit.

0

Więc jak wspomniałem: wczytujemy z pliku .txt listę kolumn i po jednym kliknięciu danej kolumny zaznacza się ona cała. I to właściwie wszystko. Następnie możemy kliknąć na daną, całą zaznaczoną kolumnę prawym i ją skopiować (to akurat jest wbudowane). Jedyny problem to samo zaznaczanie i reakcja textBrowsera na kliknięcie.

0

wiersze czy kolumny?
Co masz w tym pliku? Co to za plik? CSV a może kolumny rozdzielone są tabulatorami?
Jeśli to jest plik tekstowy CSV to nie powinieneś używać QTextEdit, ale wczytać dane do modelu danych i wcisnąć to potem do QTableView.

Jeśli to jest zwykły plik tekstowy (np "Pan Tadeusz") to nie rozumiem twoich wymagań.
Nadal jestem przekonany, że to jest problem XY.

0

Odświeżam (odpowiedź w komentarzu).

1

Czyli masz szczególny przypadek CSV - liczba kolumn 1.
QTableWidget zapewne ci wystarczy.

QTextStream in(&file);

int rowNr = 0;
while (!in.atEnd()) {
    auto line = in.readLine();
    auto item = new QTableWidgetItem(line);
    item->setFlags(… …);
    ui->tableWidget->setItem(rowNr++, 0, item);
}
0

W porządku. Ustawiłem tryb single selection w gui, kod wygląda następująco:

QTextStream in(&file);

	int rowNr = 0;
	while (!in.atEnd()) {
		auto line = in.readLine();
		auto item = new QTableWidgetItem(line);
		item->setFlags(Qt::ItemIsSelectable);
		ui.tableWidget->setItem(rowNr++, 0, item);
	}

Jednak tabela w ogóle się nie wczytuje. Próbuję załadować następujący .txt:

  0.0000000e+000
  1.0000000e-001
  2.0000000e-001
  3.0000000e-001
  4.0000000e-001
  5.0000000e-001
  6.0000000e-001
  7.0000000e-001
  8.0000000e-001
  9.0000000e-001
  1.0000000e+000
  1.1000000e+000
  1.2000000e+000
  1.3000000e+000
  1.4000000e+000
  1.5000000e+000
  1.6000000e+000
  1.7000000e+000
  1.8000000e+000
  1.9000000e+000
  2.0000000e+000
1

pewnie trzeba dodać: ui->tableWidget->insertRow(rowNr); przed setItem.

0

Jest już lepiej, ale ciągle nie to. Aktualnie pojawia się tablica z samymi wierszami od 1 do 21 (tyle, ile jest ich w .txt). Stworzyłem coś takiego:

QTextStream in(&file);
	ui.tableWidget->setColumnCount(1);

	int rowNr = 0;
	while (!in.atEnd()) {
		auto line = in.readLine();
		auto item = new QTableWidgetItem(line);
		item->setFlags(Qt::ItemIsSelectable);
		ui.tableWidget->insertRow(rowNr);
		ui.tableWidget->setItem(rowNr++, 0, item);
	}

Niestety nadal ten sam efekt (dla kolumn jako intów też bez zmian).

1

Z dokumentacji:

By default, items are enabled, editable, selectable, checkable, and can be used both as the source of a drag and drop operation and as a drop target.

Wywal linijkę item->setFlags( Qt::ItemIsSelectable ) bo jak widzisz jest Ci niepotrzebna. Funkcjonalność 'wybierania' jest domyślnie włączona. A ustawiając flagi ręcznie zapominasz o reszcie, przez co element tablicy jest nieaktywny ( flaga Qt::ItemIsEnabled )

1 użytkowników online, w tym zalogowanych: 0, gości: 1