Seite 1 von 1

QTextEdit um Buttons erweitern

Verfasst: 15. September 2010 22:13
von d4eRc
Hallo zusammen,

ich möchte die QTextEdit-Klasse erweitern, indem ich Buttons für Fett/Kursiv/Unterstreichen-Formatierung hinzufüge. Bis jetzt ist das draus geworden:

Code: Alles auswählen

class message_field : public QTextEdit {
Q_OBJECT
  public:
    message_field(QWidget *parent = 0);
    QPushButton *bold_button;
    QPushButton *italic_button;
    QPushButton *underline_button;
};

message_field::message_field(QWidget *parent)
{
bold_button = new QPushButton(this);
bold_button->setIcon(QIcon::fromTheme("format-text-bold"));
italic_button = new QPushButton(this);
italic_button->setIcon(QIcon::fromTheme("format-text-italic"));
underline_button = new QPushButton(this);
underline_button->setIcon(QIcon::fromTheme("format-text-underline"));

QVBoxLayout *buttons = new QVBoxLayout;
buttons->addWidget(bold_button);
buttons->addWidget(italic_button);
buttons->addWidget(underline_button);
}
Jetzt möchte ich nur noch das buttons-Layout neben dem "Hauptbestandteil" des QTextEdit platzieren. Ich kann ja schlecht ein Haupt-Layout definieren und layout->addWidget(this); benutzen, das macht ja keinen Sinn.
Gibt es eine möglichkeit, wie ich auf das eigentliche Textfeld des QTextEdit zugreifen kann, oder muss ich eine neue QWidget-Klasse erstellen, die intern ein QTextEdit instanziert und dazu die Buttons bastelt?

Grüße

Verfasst: 16. September 2010 08:24
von khrl01
class message_field : public QTextEdit
Gibt es eine möglichkeit, wie ich auf das eigentliche Textfeld des QTextEdit zugreifen kann, oder muss ich eine neue QWidget-Klasse erstellen, die intern ein QTextEdit instanziert und dazu die Buttons bastelt?
Du hast ja ein Object abgeleitet von QTextEdit. Um auf das Textfeld zuzugreifen musst Du nur auf this zugreifen...

grüsse
karl-heinz

Verfasst: 17. September 2010 08:33
von d4eRc
Soweit war ich ja auch, nur ist es ja nicht möglich, das aktuelle haupt-widget zu einem layout hinzuzufügen, das "widget-intern" ist. Falls man

Code: Alles auswählen

layout->addWidget(this);
probiert, endet das in einer Endlosschleife. Ich bräuchte also einen Weg, wie ich auf den "weißen Rahmen" des QTextEdits zugreifen kann, ohne dass ich gleich das gesamte Widget ansprechen muss. Natürlich bin ich auch für andere Vorschläge (als Layouts) offen, ich möchte nur irgendwie ein QTextEdit bekommen, das intern gleich die Funktionalität für Fett/Kursiv etc.-Buttons hat, ohne dass ich eine extra Klasse schreiben muss, die von QTextEdit jedoch nicht abgeleitet ist.

Grüße

Verfasst: 17. September 2010 08:35
von franzf
Nur von QWidget ableiten und dein TextEdit als Member. Dann kannst du dein TextEdit in ein Layout packen und dieses dem "this" verpassen.

Verfasst: 18. September 2010 01:02
von d4eRc
Dann stehen mir die Funktionen von QTextEdit nicht mehr in der Klasse zu verfügung, d.h. von außerhalb müsse ich dann auf bspw:

Code: Alles auswählen

message_field->textedit->text()
zugreifen, vorrausgesetzt das textedit an sich ist "public". Eine andere Möglichkeit gibt es nicht, sehe ich das richtig? Das "perfekte" Ergebnis wäre eine Klasse, die die komplette funktionalität von QTextEdit aufweißt und um die Buttons nur erweitert wäre.

Schonmal ein Danke!

Verfasst: 18. September 2010 07:52
von franzf
Du kannst doch auch nur ein Widget schreiben, das die Knöpfe enthält, und dann beim/nach dem Erstellen ein QTextEdit zuweisen, das bearbeitet werden soll? Oder greifst du in deiner Klasse auf protected Attribute von QTextEdit zu? Irgend welche Events?

Verfasst: 18. September 2010 18:19
von d4eRc
Das ist eine gute Idee. Ich würde also ein Button-Widget schreiben, dem ich einen Pointer auf das QTextEdit übergebe - in diesem Widget kann ich dann automatisch die QTextEdit-Methoden setFontItalic etc. verwenden. Ansonsten brauche ich nichts vom QTextEdit.

Danke für die Hilfe, ich probier das gleich mal aus!