Qt - okno dialogowe wyboru koloru i zmiana koloru czcionki w kontrolce QTextEdit

Autor podstrony: Krzysztof Zajączkowski

Stronę tą wyświetlono już: 3584 razy

Każdy system posiada pewne standardowe okna dialogowe, które udostępniają aplikacjom podstawowe funkcjonalności. Do takich okien należy okno dialogowe wyboru koloru, które wykorzystam do dodania możliwości ustawienia kolorów tekstu wpisywanego w kontrolce QTextEdit. Będzie to oczywiście kontynuacja projektu rozpoczętego na stronie Programowanie → Qt Creator GUI → Qt - kontrolka QTextEdit i kontynuowanego na kolejnych podstronach tego działu.

Do stworzenia okna dialogowego wyboru kolorów konieczne jest użycie klasy QColorDialog a więc i standardowo załączenie pliku QColorDialog. Utworzony zostanie również w sposób dynamiczny obiekt klasy QPushButton, pod który podpięte zostanie wywołanie okna dialogowego wyboru kolorów. W związku z tym należy załączyć również plik QPushButton, a w klasie MainWindow dodać pole:

QPushButton *fontColor;

W konstruktorze klasy MainWindow trzeba utworzyć i odpowiednio ustawić właściwości przycisku:

fontColor = new QPushButton; // tworzę obiekt klasy QPushButton ui->mainToolBar->addWidget(fontColor); // dodaję przycisk do paska narzędziowego QColor textColor = ui->edit->textColor(); // pobieram kolor tekstu // formatowanie koloru przycisku setButtonColor(fontColor, ui->edit->textColor()); // metoda utworzona do zmiany koloru przycisku QObject::connect(fontColor, SIGNAL(clicked(bool)), this, SLOT(onFontColorClicked())); // podpinam się pod sygnał clicked kontrolki QPushButton

Metoda setButtonColor zaimplementowana w klasie MainWindow wygląda następująco:

void MainWindow::setButtonColor(QPushButton* button, QColor color){ // ustawiam styl koloru tła przycisku button->setStyleSheet(QString("background: #%1%2%3").arg(color.red(), 2, 16, QChar('0')).arg(color.green(), 2, 16, QChar('0')).arg(color.blue(), 2, 16, QChar('0'))); }

Konieczne jest również utworzenie slotu w klasie MainWindow wywoływanego w wyniku kliknięcia przycisku:

void MainWindow::onFontColorClicked(){ QColorDialog cd(this); // tworzę obiekt klasy odpowiedzialnej za wyświetlenie i obsługę okna wyboru koloru cd.setCurrentColor(fontColor->palette().color(QPalette::Button)); // ustawiam kolor domyślny na obecny kolor czcionki if(cd.exec()){ // wywołuję okno dialogowe i jeżeli użytkownik zatwierdził wybór koloru to QColor textColor = cd.selectedColor(); // pobieram kolor wybrany przez użytkownika ui->edit->setTextColor(textColor); // ustawiam kolor czcionki w kontrolce QTextEdit setButtonColor(fontColor, textColor); // ustawiam kolor przycisku } }

W metodzie setTextStyleButtonsState należy wprowadzić modyfikację, polegającą na uaktualnianiu koloru przycisku zmiany koloru czcionki względem bieżącej pozycji kursora:

void MainWindow::setTextStyleButtonsState(){ QTextCursor cursor = ui->edit->textCursor(); if(!cursor.hasSelection()){ ui->actionUnderline->setChecked( ui->edit->fontUnderline() ); ui->actionBold->setChecked( ui->edit->fontWeight() == QFont::Bold ? true : false ); ui->actionItalic->setChecked( ui->edit->fontItalic() ); int size = ui->edit->fontPointSize(); fontSize->setValue(size ? size : ui->edit->fontInfo().pointSize()); QString fontFamily = ui->edit->fontFamily().length() ? ui->edit->fontFamily() : ui->edit->fontInfo().family(); if(fontFamily != fontFamilies->currentText()){ fontFamilies->setCurrentIndex(fontFamilies->findText(fontFamily)); } setButtonColor(fontColor, ui->edit->textColor()); // dodana linijka kodu } }

Wynik działania powyższego kodu można zobaczyć na poniższym rysunku.

Widok działania programu z zmienionym kolorem tekstu
Rys. 1
Widok działania programu z zmienionym kolorem tekstu w kontrolce QTextEdit
Strony powiązane
strony powiązane
  1. doc.qt.io/qt-5/qcolordialog-obsolete.html - opis klasy QColorDialog na stronie dokumentacji Qt
  2. doc.qt.io/qt-4.8/qtextedit.html - opis klasy QTextEdit na stronie dokumentacji Qt
Propozycje książek