Пример #1
0
// Neue Widget-Klasse vom eigentlichen Widget ableiten
MyWindow::MyWindow( QMainWindow *parent,
                    Qt::WindowFlags flags) :
                    QMainWindow(parent, flags)  {
    editor = new QTextEdit;
    editor->setWhatsThis(
                "Dieser Text kann mit (Shift)+(F1) angezeigt werden."
                "Auch eine <b>HTML-Formatierung</b> ist möglich. ");


    // Das komplette Menü zum Hauptprogramm
    QMenu *fileMenu = new QMenu(tr("&Datei"), this);
    menuBar()->addMenu(fileMenu);
    act1 = fileMenu->addAction(
                QIcon(QString("%1%2").arg(QCoreApplication::applicationDirPath()).arg("/images/page_white.png")), tr("&Neu"),
       this, SLOT(newFile()),
       QKeySequence(tr("Ctrl+N", "Datei|Neu")) );
    act1->setStatusTip(
       tr("Löscht den aktuellen Inhalt der Datei"));
    act2 = fileMenu->addAction(
                QIcon(QString("%1%2").arg(QCoreApplication::applicationDirPath()).arg("/images/folder_page_white.png")),
       tr("&Öffnen..."), this, SLOT(openFile() ),
       QKeySequence(tr("Ctrl+O", "Datei|Öffnen")));
    act2->setStatusTip(
       tr("Öffnet eine Datei in den Texteditor"));
    fileMenu->addSeparator();
    act3 = fileMenu->addAction(
                QIcon(QString("%1%2").arg(QCoreApplication::applicationDirPath()).arg("/images/cancel.png"))   ,
                tr("Be&enden"),
       qApp, SLOT(quit()),
       QKeySequence(tr("Ctrl+E", "Datei|Beenden")) );
    act3->setStatusTip(tr("Programm beenden"));
    QMenu *workMenu = new QMenu(
       tr("&Bearbeiten"), this);
    menuBar()->addMenu(workMenu);
    act4 = workMenu->addAction(
       tr("&Suchen"), this, SLOT(search()),
       QKeySequence(tr("Ctrl+S", "Bearbeiten|Suchen")));
    act4->setStatusTip(
       tr("Nach einer Stringfolge suchen") );
    // Menü mit Linie von der Leiste Abnehmbar
    fileMenu->setSeparatorsCollapsible(true);

    // Mehrere Aktionen erzeugen
    QAction* underLineAct = new QAction(
       tr("&Unterstreichen"), this );
    underLineAct->setCheckable(true);
    underLineAct->setShortcut(tr("Ctrl+U"));
    underLineAct->setStatusTip(
       tr("Text unterstreichen") );
    underLineAct->setIcon(
                QIcon(QString("%1%2").arg(QCoreApplication::applicationDirPath()).arg("/images/text_underline.png")));
    connect( underLineAct, SIGNAL(triggered(bool)),
             editor, SLOT(setFontUnderline(bool)) );

    QAction *leftAlignAct = new QAction(
       tr("&Links ausgerichtet"), this);
    leftAlignAct->setCheckable(true);
    leftAlignAct->setShortcut(tr("Ctrl+L"));
    leftAlignAct->setStatusTip(
       tr("Text links ausrichten"));
    leftAlignAct->setIcon(
                 QIcon(QString("%1%2").arg(QCoreApplication::applicationDirPath()).arg("/images/text_align_left.png")));
    connect( leftAlignAct, SIGNAL(triggered()),
             this, SLOT(leftAlignment() ) );

    QAction *rightAlignAct = new QAction(
       tr("&Rechts ausgerichtet"), this);
    rightAlignAct->setCheckable(true);
    rightAlignAct->setShortcut(tr("Ctrl+R"));
    rightAlignAct->setStatusTip(
       tr("Text rechts ausrichten") );
    rightAlignAct->setIcon(
                 QIcon(QString("%1%2").arg(QCoreApplication::applicationDirPath()).arg("/images/text_align_right.png")));
    connect( rightAlignAct, SIGNAL(triggered()),
             this, SLOT(rightAlignment() ) );

    QAction *justifyAct = new QAction(
       tr("&Bündig ausrichten"), this);
    justifyAct->setCheckable(true);
    justifyAct->setShortcut(tr("Ctrl+J"));
    justifyAct->setStatusTip(
       tr("Text bündig ausrichten"));
    justifyAct->setIcon(
                QIcon(QString("%1%2").arg(QCoreApplication::applicationDirPath()).arg("/images/text_align_justify.png")));
    connect( justifyAct, SIGNAL(triggered()),
             this, SLOT(justifyAlignment() ) );

    QAction *centerAct = new QAction(
       tr("&Zentriert ausrichten"), this);
    centerAct->setCheckable(true);
    centerAct->setShortcut(tr("Ctrl+E"));
    centerAct->setStatusTip(
       tr("Text zentriert ausrichten") );
    centerAct->setIcon(
                  QIcon(QString("%1%2").arg(QCoreApplication::applicationDirPath()).arg("/images/text_align_center.png")));
    connect( centerAct, SIGNAL(triggered()),
             this, SLOT(centerAlignment() ) );

    // Einige Aktionen zu einer Gruppe zusammenfassen
    QActionGroup* alignmentGroup = new QActionGroup(
       this );
    alignmentGroup->addAction(leftAlignAct);
    alignmentGroup->addAction(rightAlignAct);
    alignmentGroup->addAction(justifyAct);
    alignmentGroup->addAction(centerAct);
    leftAlignAct->setChecked(true);

    // Nochmals zwei weitere Aktionen
    QAction *InZoom = new QAction(
       tr("&Zoom in ..."), this );
    InZoom->setStatusTip(tr("Zoom in the text"));
    connect( InZoom, SIGNAL(triggered()),
             editor, SLOT(zoomIn() ) );
    QAction *OutZoom = new QAction(
       tr("&Zoom out ..."), this );
    OutZoom->setStatusTip(tr("Zoom out the text"));
    connect( OutZoom, SIGNAL(triggered() ),
             editor, SLOT(zoomOut() ) );

    // Ein Sub-Menü "Format" bei "Bearbeiten" einfügen
    QMenu *formatMenu = workMenu->addMenu(
       tr("&Format") );
    formatMenu->addAction(underLineAct);
    formatMenu->addSeparator();
    formatMenu->addAction(leftAlignAct);
    formatMenu->addAction(rightAlignAct);
    formatMenu->addAction(justifyAct);
    formatMenu->addAction(centerAct);
    formatMenu->addSeparator();
    formatMenu->addAction(InZoom);
    formatMenu->addAction(OutZoom);
    workMenu->setTearOffEnabled(true);
    workMenu->setWindowTitle("Bearbeiten");

    // Zur Demonstration eine Aktion mit QVariant
    Start = new QAction(tr("&Programmstart ..."), this);
    Start->setStatusTip(tr("Zeit des Programmstarts"));
    Start->setData(QVariant(QTime::currentTime()));
    QFont font; font.setBold(true);
    Start->setFont(font);
    Start->setShortcut(tr("Ctrl+T"));
    Start->setShortcutContext(Qt::ApplicationShortcut);
    connect( Start, SIGNAL( triggered() ),
             this, SLOT( printStart() ) );
    workMenu->addAction(Start);


    // Eine neue Statusleiste erzeugen und zum
    // Hauptfenster hinzufügen
    (void*) statusBar ();
    // Permanente Meldung in der Statusleiste
    // Zeichen, Wörter, Zeilen
    sLabel = new QLabel;
    sLabel->setFrameStyle(
       QFrame::Panel | QFrame::Sunken );
    sLabel->setLineWidth(2);
    statusBar()->addPermanentWidget(sLabel);
    connect( editor, SIGNAL( textChanged() ),
             this, SLOT( updateStatusBar() ) );
    updateStatusBar();
    // Laufend aktuelle Uhrzeit in der Statusleiste
    time = new QLCDNumber;
    time->setFrameStyle(QFrame::Panel | QFrame::Sunken);
    time->setLineWidth(2);
    time->setSegmentStyle(QLCDNumber::Flat);
    statusBar()->addPermanentWidget(time);
    QTimer *timer = new QTimer(this);
    connect( timer, SIGNAL(timeout()),
             this, SLOT(updateTime()) );
    // Jede Sekunde updateTime() aufrufen
    timer->start(1000);
    updateTime();

    // Werkzeugleiste erzeugen
    toolFile = addToolBar(tr("Datei"));
    // Icons mit Text darunter anzeigen
    toolFile->setToolButtonStyle (
       Qt::ToolButtonTextUnderIcon );
    // Werkzeugleiste nur nach links
    // oder oben Verschiebbar
    toolFile->setAllowedAreas(
       Qt::LeftToolBarArea | Qt::TopToolBarArea );
    // Aktionen zur Werkzeugleiste hinzufügen
    toolFile->addAction(act1);
    toolFile->addAction(act2);
    toolFile->addAction(act3);
    // Noch eine Werkzeugleiste
    toolWork = addToolBar(tr("Bearbeiten"));
    // Werkzeugleiste unten anzeigen
    addToolBar(Qt::TopToolBarArea, toolWork );
    // Position nicht mehr veränderbar
    toolWork->setMovable(false);
    // Aktionen zur Werkzeugleiste hinzufügen
    toolWork->addAction(underLineAct);
    toolWork->addSeparator ();
    toolWork->addAction(leftAlignAct);
    toolWork->addAction(rightAlignAct);
    toolWork->addAction(justifyAct);
    toolWork->addAction(centerAct);
    toolWork->addSeparator ();
    // Eine Schrift-Combobox zur Werkzeugleiste
    QFontComboBox *cFont = new QFontComboBox;
    toolWork->addWidget(cFont);
    connect(
      cFont, SIGNAL( currentFontChanged(const QFont& )),
      editor, SLOT(setCurrentFont ( const QFont&) ) );

    // Ein neues Dock-Widget-erzeugen
    QDockWidget *dock = new QDockWidget(
       tr("WYSIWYG-Editor"), this );
    // nur in den rechten und linken Bereich erlauben
    dock->setAllowedAreas(
       Qt::LeftDockWidgetArea|Qt::RightDockWidgetArea);
    // Widget für das Dock-Widget erzeugen
    dock_editor = new QTextEdit;
    // Editor als Widget im Dock-Fenster verwenden
    dock->setWidget(dock_editor);
    // auf der rechten Seite zum Hauptfenster hinzufügen
    addDockWidget(Qt::RightDockWidgetArea, dock);
    connect( editor, SIGNAL(textChanged() ),
             this, SLOT( showHTML() ) );

    // Einstellungen des Programms speichern
    // Im Beispiel wird nur (ggf.) die zuletzt
    // geöffnete Datei und die Größe des Fensters
    settings = new QSettings(
       tr("J.Wolf"), tr("JWTexteditor") );
    settings->beginGroup("HauptFenster");
    QString fileName =
       settings->value("lastFile").toString();
    QSize size =
       settings->value("size", sizeHint()).toSize();
    if (!fileName.isEmpty()) {
       QFile file(fileName);
       if (file.open(QFile::ReadOnly | QFile::Text)) {
          editor->setPlainText(file.readAll());
          statusBar()->showMessage(
             tr("Zuletzt geöffnete Datei "
                "erfolgreich geladen"));
          // Wieder setzen
          settings->setValue("lastFile", fileName );
       }
       else // falls die Datei nicht mehr existiert
          settings->setValue("lastFile", "");
    }
    else // Keine Datei gesetzt
       settings->setValue("lastFile", "");
    settings->endGroup();

    if( size.isNull() )
       resize(640, 480);
    else
       resize(size);
    setCentralWidget(editor);
    setWindowTitle("QMainWindow - Demo");
}