Download - QT – Windows, menus, and such C++ GUI Programming with Qt 4 Qt 4.5 Reference Documentation Blanchette and Summerfield, Ch. 3.

Transcript
Page 1: QT – Windows, menus, and such C++ GUI Programming with Qt 4 Qt 4.5 Reference Documentation Blanchette and Summerfield, Ch. 3.

QT – Windows, menus, and such

C++ GUI Programming with Qt 4Qt 4.5 Reference Documentation

Blanchette and Summerfield, Ch. 3

Page 2: QT – Windows, menus, and such C++ GUI Programming with Qt 4 Qt 4.5 Reference Documentation Blanchette and Summerfield, Ch. 3.

Overview

• Another example of essential Qt concepts – Addressbook tutorial

• Qt – “main window”

• Subclassing – many “actions” / methods

• Menus, tool bars– Selection of item creates action, using signals and slots

• Implementing functionality – in actions

• “Context menus” – right button

• Modal vs. modeless dialogs

Page 3: QT – Windows, menus, and such C++ GUI Programming with Qt 4 Qt 4.5 Reference Documentation Blanchette and Summerfield, Ch. 3.

Main Windows(quick look – overview)

• For Qt (and other systems) “main window” refers to a kind of “executive” control and coordination of elements

– Dialogs, menus, tool bars, status bars

• After this, final essential that remains is to look carefully at implementation of application functionality

• Blanchette and Summerfield build on spreadsheet dialogs

• Will take a quick look at example

Page 4: QT – Windows, menus, and such C++ GUI Programming with Qt 4 Qt 4.5 Reference Documentation Blanchette and Summerfield, Ch. 3.

Creating Application’s Main Window Subclassing QMainWindow

// mainwindow.h - Create main window as subclass of QMainWindow#include <qmainwindow.h>#include <qstringlist.h>

class QAction;class QLabel;class FindDialog;class Spreadsheet;

class MainWindow : public QMainWindow{ Q_OBJECTpublic: MainWindow(QWidget *parent = 0, const char *name = 0);protected: void closeEvent(QCloseEvent *event); // reimplement to modify void contextMenuEvent(QContextMenuEvent *event); // “ right-click

menu

Page 5: QT – Windows, menus, and such C++ GUI Programming with Qt 4 Qt 4.5 Reference Documentation Blanchette and Summerfield, Ch. 3.

mainwindow.h, 2 Subclassing QMainWindow – Menus & slots for menu options

// Most menu options are implemented as private slots (methods, functions) // in MainWindow

// Below and on next page defines slots for this menu structure// (will see more of slot definitions next week)

private slots: void newFile(); void open(); bool save(); bool saveAs(); void find(); void goToCell(); void sort(); void about();

Page 6: QT – Windows, menus, and such C++ GUI Programming with Qt 4 Qt 4.5 Reference Documentation Blanchette and Summerfield, Ch. 3.

mainwindow.h, 3 Subclassing QMainWindow – More slots

// … and so on, … void updateCellIndicators(); void spreadsheetModified(); void openRecentFile(int param);private: void createActions(); void createMenus(); void createToolBars(); void createStatusBar(); void readSettings(); void writeSettings(); bool maybeSave(); void loadFile(const QString &fileName); void saveFile(const QString &fileName); void setCurrentFile(const QString &fileName); void updateRecentFileItems(); QString strippedName(const QString &fullFileName);

Page 7: QT – Windows, menus, and such C++ GUI Programming with Qt 4 Qt 4.5 Reference Documentation Blanchette and Summerfield, Ch. 3.

mainwindow.h, 4 Subclassing QMainWindow – More slots – to support UI

// … and so forth (more later)

Spreadsheet *spreadsheet;FindDialog *findDialog;QLabel *locationLabel;QLabel *formulaLabel;QLabel *modLabel;QStringList recentFiles;QString curFile;QString fileFilters;bool modified;

enum { MaxRecentFiles = 5 };int recentFileIds[MaxRecentFiles];

QPopupMenu *fileMenu;QPopupMenu *editMenu;QPopupMenu *selectSubMenu;QPopupMenu *toolsMenu;QPopupMenu *optionsMenu;QPopupMenu *helpMenu;QToolBar *fileToolBar;QToolBar *editToolBar;QAction *newAct;QAction *openAct;QAction *saveAct;···QAction *aboutAct;QAction *aboutQtAct;};

Page 8: QT – Windows, menus, and such C++ GUI Programming with Qt 4 Qt 4.5 Reference Documentation Blanchette and Summerfield, Ch. 3.

• And that’s “all” there is to mainwindow.h!

• … and mainwindow.cpp holds the implementation

Page 9: QT – Windows, menus, and such C++ GUI Programming with Qt 4 Qt 4.5 Reference Documentation Blanchette and Summerfield, Ch. 3.

mainwindow.cpp“implementation” – should be familiar structure

MainWindow::MainWindow(QWidget *parent, const char *name) : QMainWindow(parent, name){ // Below creates spreadsheet widget and it’s constituent widgets spreadsheet = new Spreadsheet(this); // class to be defined later setCentralWidget(spreadsheet);

createActions(); // next slide createMenus(); createToolBars(); createStatusBar();

readSettings();

setCaption(tr("Spreadsheet")); setIcon(QPixmap::fromMimeSource("icon.png"));

findDialog = 0; fileFilters = tr("Spreadsheet files (*.sp)"); modified = false; }

Page 10: QT – Windows, menus, and such C++ GUI Programming with Qt 4 Qt 4.5 Reference Documentation Blanchette and Summerfield, Ch. 3.

mainwindow.cppcreating menu and toolbar elements, and actions

• A Qt “action” is item that can be added to menu or toolbar

• To create menus and toolbars in Qt:– Create actions– Add actions to menus– Add actions to toolbars

• Below is Qt-ese for the menu element “New”:

void MainWindow::createActions(){ newAct = new QAction(tr("&New"), tr("Ctrl+N"), this); newAct->setIconSet(QPixmap::fromMimeSource("new.png")); newAct->setStatusTip(tr("Create a new spreadsheet file")); connect(newAct, SIGNAL(activated()), this, SLOT(newFile()));

Page 11: QT – Windows, menus, and such C++ GUI Programming with Qt 4 Qt 4.5 Reference Documentation Blanchette and Summerfield, Ch. 3.

mainwindow.cppcreating menu and toolbar elements, and actions, 2

// Show Grid is toggle (Boolean), rendered with check mark

showGridAct = new QAction(tr("&Show Grid"), 0, this);showGridAct->setToggleAction(true);showGridAct->setOn(spreadsheet->showGrid());showGridAct->setStatusTip(tr("Show or hide spreadsheet "grid"));connect(showGridAct, SIGNAL(toggled(bool)),spreadsheet, SLOT(setShowGrid(bool)));

// For “About”:

aboutQtAct = new QAction(tr("About &Qt"), 0, this);aboutQtAct->setStatusTip(tr("Show the Qt library’s About box"));connect(aboutQtAct, SIGNAL(activated()), qApp, SLOT(aboutQt()));}

// Have now created all actions

Page 12: QT – Windows, menus, and such C++ GUI Programming with Qt 4 Qt 4.5 Reference Documentation Blanchette and Summerfield, Ch. 3.

mainwindow.cppBuilding the menu system, “File”

• Actions are invoked through menu system– All menus are instances of QPopupMenu

void MainWindow::createMenus(){ fileMenu = new QPopupMenu(this); // Create file menu newAct->addTo(fileMenu); // Add “actions” to

it openAct->addTo(fileMenu); saveAct->addTo(fileMenu); saveAsAct->addTo(fileMenu); fileMenu->insertSeparator(); exitAct->addTo(fileMenu);

for (int i = 0; i < MaxRecentFiles; ++i) recentFileIds[i] = -1;

Page 13: QT – Windows, menus, and such C++ GUI Programming with Qt 4 Qt 4.5 Reference Documentation Blanchette and Summerfield, Ch. 3.

mainwindow.cppBuilding the menu system, “Edit”

• Edit menu includes a submenu, otherwise, “same song, 2nd …”– Submenu simply has parent and inserted where it is to appear

editMenu = new QPopupMenu(this);cutAct->addTo(editMenu);copyAct->addTo(editMenu);pasteAct->addTo(editMenu);deleteAct->addTo(editMenu);

selectSubMenu = new QPopupMenu(this);selectRowAct->addTo(selectSubMenu);selectColumnAct->addTo(selectSubMenu);selectAllAct->addTo(selectSubMenu);editMenu->insertItem(tr("&Select"), selectSubMenu); // submenu

editMenu->insertSeparator();findAct->addTo(editMenu);goToCellAct->addTo(editMenu);

Page 14: QT – Windows, menus, and such C++ GUI Programming with Qt 4 Qt 4.5 Reference Documentation Blanchette and Summerfield, Ch. 3.

mainwindow.cpptoolbars

• Creating toolbars is very similar to creating menus:

void MainWindow::createToolBars(){ fileToolBar = new QToolBar(tr("File"), this); newAct->addTo(fileToolBar); openAct->addTo(fileToolBar); saveAct->addTo(fileToolBar);

editToolBar = new QToolBar(tr("Edit"), this); cutAct->addTo(editToolBar); copyAct->addTo(editToolBar); pasteAct->addTo(editToolBar); editToolBar->addSeparator(); findAct->addTo(editToolBar); goToCellAct->addTo(editToolBar);}

Page 15: QT – Windows, menus, and such C++ GUI Programming with Qt 4 Qt 4.5 Reference Documentation Blanchette and Summerfield, Ch. 3.

mainwindow.cpp“context menu” – invoke w/rt button, creating

• User right mouse button

• Reimplement QWidget :: contextMenuEvent

void MainWindow::contextMenuEvent(QContextMenuEvent *event){ QPopupMenu contextMenu(this); cutAct->addTo(&contextMenu); copyAct->addTo(&contextMenu); pasteAct->addTo(&contextMenu);

// “exec” causes to be shown at loc contextMenu.exec(event->globalPos());}

Page 16: QT – Windows, menus, and such C++ GUI Programming with Qt 4 Qt 4.5 Reference Documentation Blanchette and Summerfield, Ch. 3.

mainwindow.cppcontext menu, event handling

• “Events are generated by Qt’s kernel to report mouse clicks, key presses, resize requests, and similar occurrences.”

– As noted, will reimplement QWidget :: contextMenuEvent to handle event

QPopupMenu *contextMenu = new QPopupMenu(this); cutAct->addTo(contextMenu); copyAct->addTo(contextMenu); pasteAct->addTo(contextMenu); contextMenu->exec(event->globalPos()); delete contextMenu;

Page 17: QT – Windows, menus, and such C++ GUI Programming with Qt 4 Qt 4.5 Reference Documentation Blanchette and Summerfield, Ch. 3.

Implementing FunctionalityWhat happens when menu item selected?

• Recall, basic control structure: - when user selects a menu item, slot/member-function is called

• Connect slot to “New” menu item:

newAct = new QAction(tr("&New"), tr("Ctrl+N"), this); newAct->setIconSet(QPixmap::fromMimeSource("new.png")); newAct->setStatusTip(tr("Create a new spreadsheet file")); connect(newAct, SIGNAL(activated()), this, SLOT(newFile()));

• Connect slot to “About” menu item:

aboutQtAct = new QAction(tr("About &Qt"), 0, this); aboutQtAct->setStatusTip(tr("Show the Qt library’s About box")); connect(aboutQtAct, SIGNAL(activated()), qApp, SLOT(aboutQt()));

Page 18: QT – Windows, menus, and such C++ GUI Programming with Qt 4 Qt 4.5 Reference Documentation Blanchette and Summerfield, Ch. 3.

Implementing FunctionalityWhat happens when menu item selected?

• Functionality can be simple or complex – In fact, here, newFile implementation is … “complex and rich”– Will leave it to student to master such topics, as interest dictates– Today, getting feel for program elements, structure, and interactions is goal

• Functionality “built in”, e.g., “About”– connect(aboutQtAct, SIGNAL(activated()), qApp, SLOT(aboutQt()));– QMessageBox::about() - a “convenience function”

void MainWindow::about(){

QMessageBox::about(this, tr("About Spreadsheet"), tr("<h2>Spreadsheet 1.0</h2>" "<p>Copyright &copy; 2003 Software Inc." "<p>Spreadsheet is a small application that " "demonstrates <b>QAction</b>, <b>QMainWindow</b>, " "<b>QMenuBar</b>, <b>QStatusBar</b>, " "<b>QToolBar</b>, and many other Qt classes."));}

Page 19: QT – Windows, menus, and such C++ GUI Programming with Qt 4 Qt 4.5 Reference Documentation Blanchette and Summerfield, Ch. 3.

Using Dialogsalmost done …

• How to create, initialize, execute, and respond to choices

• Dialog (window) “modes”– Terminology not specific to Qt– Modeless: executes independently of other windows– Modal: executes (pops up) when invoked and nothing else executes until closed

• Qt dialogs and typical user action handling– Modeless

• Have their signals connected to slots that respond to user action• Invoked using show()

– Modal• Handle user action within dialog, no signals and slots• Invoked using exec()

Page 20: QT – Windows, menus, and such C++ GUI Programming with Qt 4 Qt 4.5 Reference Documentation Blanchette and Summerfield, Ch. 3.

Recall, findDialog

Page 21: QT – Windows, menus, and such C++ GUI Programming with Qt 4 Qt 4.5 Reference Documentation Blanchette and Summerfield, Ch. 3.

Define finddialog slots, or functions

// Called when user clicks Find button, emits signal findPrevious() or findNextvoid FindDialog ::findClicked(){

QString text = lineEdit->text();Qt::CaseSensitivity cs =

caseCheckBox->isChecked() ? Qt::CaseSensitive : Qt::CaseInsensitive;

if (backwardCheckBox->isChecked()) {emit findPrevious(text, cs);

} else { emit findNext(text, cs); // emit keyword (macro) specific to Qt}

}

// Called whenever user changes text in line editor, enables button if there is text in line editorvoid FindDialog::enableFindButton(const QString &text){

findButton->setEnabled (!text.isEmpty ());}

Page 22: QT – Windows, menus, and such C++ GUI Programming with Qt 4 Qt 4.5 Reference Documentation Blanchette and Summerfield, Ch. 3.

A Modeless Dialog (box, window)• findDialog - window (dialog) that enables user to search for text

– Invoked when user clicks Edit|Find to “pop up” (execute) Find dialog (box)– Recall functionality implemented in last chapter– Basically, “just run it”

void MainWindow::find(){ if (!findDialog) { // if 1st execution findDialog = new FindDialog(this); connect(findDialog, SIGNAL(findNext(const QString &, bool)),

spreadsheet, SLOT(findNext(const QString &, bool))); connect(findDialog, SIGNAL(findPrev(const QString &, bool)), spreadsheet, SLOT(findPrev(const QString &, bool))); } findDialog->show(); // make not hidden (if so) findDialog->raise(); // may need to bring from “underneath” other wins findDialog->setActiveWindow(); // make active (color title bar, give focus, etc.)}

Page 23: QT – Windows, menus, and such C++ GUI Programming with Qt 4 Qt 4.5 Reference Documentation Blanchette and Summerfield, Ch. 3.

A Modal Dialog

• When invoke modal dialogs using exec(), typically don’t need to set up any signal-slot connection

• Qdialog::exec() returns true, if dialog accepted, false otherwise– GoToCellDialog - Created with Designer in Ch. 2– OK was connected to accept(), Cancel to reject()– Will need to essentially implement all functionality

void MainWindow::goToCell() { GoToCellDialog dialog(this); if (dialog.exec()) { QString str = dialog.lineEdit->text();// get text from input widget spreadsheet->setCurrentCell(str.mid(1).toInt() - 1, // set… defined in program str[0].upper().unicode() - ’A’); } }

Page 24: QT – Windows, menus, and such C++ GUI Programming with Qt 4 Qt 4.5 Reference Documentation Blanchette and Summerfield, Ch. 3.

Other Dialogs for Spreadsheet

• Many examples provided in chapter

• Some straightforward

• Some arcane

• When in doubt … keep it simple

Page 25: QT – Windows, menus, and such C++ GUI Programming with Qt 4 Qt 4.5 Reference Documentation Blanchette and Summerfield, Ch. 3.

End

• .