Upload
evangeline-lynch
View
277
Download
0
Embed Size (px)
DESCRIPTION
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
Citation preview
QT – Windows, menus, and such
C++ GUI Programming with Qt 4Qt 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
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
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
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();
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);
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;};
• And that’s “all” there is to mainwindow.h!
• … and mainwindow.cpp holds the implementation
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; }
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()));
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
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;
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);
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);}
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());}
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;
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()));
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 © 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."));}
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()
Recall, findDialog
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 ());}
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.)}
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’); } }
Other Dialogs for Spreadsheet
• Many examples provided in chapter
• Some straightforward
• Some arcane
• When in doubt … keep it simple
End
• .