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

Stronę tą wyświetlono już: 407 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:

Listing 1
  1. QPushButton *fontColor;

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

Listing 2
  1. fontColor = new QPushButton; // tworzę obiekt klasy QPushButton
  2. ui->mainToolBar->addWidget(fontColor); // dodaję przycisk do paska narzędziowego
  3. QColor textColor = ui->edit->textColor(); // pobieram kolor tekstu
  4. // formatowanie koloru przycisku
  5. setButtonColor(fontColor, ui->edit->textColor()); // metoda utworzona do zmiany koloru przycisku
  6. 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:

Listing 3
  1. void MainWindow::setButtonColor(QPushButton* button, QColor color){
  2. // ustawiam styl koloru tła przycisku
  3. 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')));
  4. }

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

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

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

Listing 5
  1. void MainWindow::setTextStyleButtonsState(){
  2. QTextCursor cursor = ui->edit->textCursor();
  3. if(!cursor.hasSelection()){
  4. ui->actionUnderline->setChecked(
  5. ui->edit->fontUnderline()
  6. );
  7. ui->actionBold->setChecked(
  8. ui->edit->fontWeight() == QFont::Bold ? true : false
  9. );
  10. ui->actionItalic->setChecked(
  11. ui->edit->fontItalic()
  12. );
  13. int size = ui->edit->fontPointSize();
  14. fontSize->setValue(size ? size : ui->edit->fontInfo().pointSize());
  15. QString fontFamily = ui->edit->fontFamily().length() ? ui->edit->fontFamily() : ui->edit->fontInfo().family();
  16. if(fontFamily != fontFamilies->currentText()){
  17. fontFamilies->setCurrentIndex(fontFamilies->findText(fontFamily));
  18. }
  19. setButtonColor(fontColor, ui->edit->textColor()); // dodana linijka kodu
  20. }
  21. }

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

Komentarze