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

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