qt 菜单例程注释

/*******************************************/

#ifndef MAINWINDOW_H

#define MAINWINDOW_H

#include <QMainWindow>

QT_BEGIN_NAMESPACE

class QAction;

class QActionGroup;

class QLabel;

class QMenu;

QT_END_NAMESPACE

//! [0]

class MainWindow : public QMainWindow

{

Q_OBJECT

public:

MainWindow();

protected:

void contextMenuEvent(QContextMenuEvent *event);

//! [0]

//! [1]

private slots:

void newFile();

void open();

void save();

void print();

void undo();

void redo();

void cut();

void copy();

void paste();

void bold();

void italic();

void leftAlign();

void rightAlign();

void justify();

void center();

void setLineSpacing();

void setParagraphSpacing();

void about();

void aboutQt();

//! [1]

//! [2]

private:

void createActions();

void createMenus();

//! [2]

//! [3]

//定义四个菜单类

QMenu *fileMenu;

QMenu *editMenu;

QMenu *formatMenu;

QMenu *helpMenu;

QActionGroup *alignmentGroup;

QAction *newAct;

QAction *openAct;

QAction *saveAct;

QAction *printAct;

QAction *exitAct;

QAction *undoAct;

QAction *redoAct;

QAction *cutAct;

QAction *copyAct;

QAction *pasteAct;

QAction *boldAct;

QAction *italicAct;

QAction *leftAlignAct;

QAction *rightAlignAct;

QAction *justifyAct;

QAction *centerAct;

QAction *setLineSpacingAct;

QAction *setParagraphSpacingAct;

QAction *aboutAct;

QAction *aboutQtAct;

QLabel *infoLabel;//标签类

};

//! [3]

#endif

/***************************************************/

#include <QtGui>

#include "mainwindow.h"

//! [0]

MainWindow::MainWindow()

{

QWidget *widget = new QWidget;

setCentralWidget(widget);//设置中央Widget

//QMainWindow has its own layout to which you can add QToolBars, QDockWidgets,

//a QMenuBar, and a QStatusBar.

//! [0]

//! [1]

QWidget *topFiller = new QWidget;

topFiller->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);

//设定横向和纵向的SizePolicy

//1. Fixed: 大小不能改变

//2. Minimum: 已经是最小, 不能再被缩小, 但能放大.

//3. Maximum: 已经是最大, 不能再被放大, 但能缩小.

//4. Preferred: 控件的sizeHint()是他的sizeHint, 能被缩小,放大.

//5. Expanding: 控件可以自行增大或者缩小.

infoLabel = new QLabel(tr("<i>Choose a menu option, or right-click to "

"invoke a context menu</i>"));

infoLabel->setFrameStyle(QFrame::StyledPanel | QFrame::Sunken);

//设置label的显示风格:Panel(镶嵌),Sunken(凹陷)

infoLabel->setAlignment(Qt::AlignCenter);

//label的文字显示在行(align)中间(AlignCenter);

//默认:left-aligned nd vertically(垂直地)-centered.

QWidget *bottomFiller = new QWidget;

bottomFiller->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);

//layout = topFiller + infoLabel + bottomFiller

QVBoxLayout *layout = new QVBoxLayout;

layout->setMargin(5);

layout->addWidget(topFiller);

layout->addWidget(infoLabel);

layout->addWidget(bottomFiller);

//如果不设置添加topFiller和bottomFiller,label会占满整个layout

widget->setLayout(layout);

//! [1]

//! [2]

createActions();

createMenus();

QString message = tr("A context menu is available by right-clicking");

statusBar()->showMessage(message);

setWindowTitle(tr("Menus"));

setMinimumSize(360, 360);//最小边长设置

resize(480, 320);//重画外形

}

//! [2]

//! [3]

void MainWindow::contextMenuEvent(QContextMenuEvent *event)

{

QMenu menu(this);

//往右击菜单里添加东西

menu.addAction(cutAct);

menu.addAction(copyAct);

menu.addAction(pasteAct);

menu.exec(event->globalPos());//捕捉全局范围内的事件

}

//! [3]

void MainWindow::newFile()

{

infoLabel->setText(tr("Invoked <b>File|New</b>"));

}

void MainWindow::open()

{

infoLabel->setText(tr("Invoked <b>File|Open</b>"));

}

void MainWindow::save()

{

infoLabel->setText(tr("Invoked <b>File|Save</b>"));

}

void MainWindow::print()

{

infoLabel->setText(tr("Invoked <b>File|Print</b>"));

}

void MainWindow::undo()

{

infoLabel->setText(tr("Invoked <b>Edit|Undo</b>"));

}

void MainWindow::redo()

{

infoLabel->setText(tr("Invoked <b>Edit|Redo</b>"));

}

void MainWindow::cut()

{

infoLabel->setText(tr("Invoked <b>Edit|Cut</b>"));

}

void MainWindow::copy()

{

infoLabel->setText(tr("Invoked <b>Edit|Copy</b>"));

}

void MainWindow::paste()

{

infoLabel->setText(tr("Invoked <b>Edit|Paste</b>"));

}

void MainWindow::bold()

{

infoLabel->setText(tr("Invoked <b>Edit|Format|Bold</b>"));

}

void MainWindow::italic()

{

infoLabel->setText(tr("Invoked <b>Edit|Format|Italic</b>"));

}

void MainWindow::leftAlign()

{

infoLabel->setText(tr("Invoked <b>Edit|Format|Left Align</b>"));

}

void MainWindow::rightAlign()

{

infoLabel->setText(tr("Invoked <b>Edit|Format|Right Align</b>"));

}

void MainWindow::justify()

{

infoLabel->setText(tr("Invoked <b>Edit|Format|Justify</b>"));

}

void MainWindow::center()

{

infoLabel->setText(tr("Invoked <b>Edit|Format|Center</b>"));

}

void MainWindow::setLineSpacing()

{

infoLabel->setText(tr("Invoked <b>Edit|Format|Set Line Spacing</b>"));

}

void MainWindow::setParagraphSpacing()

{

infoLabel->setText(tr("Invoked <b>Edit|Format|Set Paragraph Spacing</b>"));

}

void MainWindow::about()

{

infoLabel->setText(tr("Invoked <b>Help|About</b>"));

QMessageBox::about(this, tr("About Menu"),

tr("The <b>Menu</b> example shows how to create "

"menu-bar menus and context menus."));

}

void MainWindow::aboutQt()

{

infoLabel->setText(tr("Invoked <b>Help|About Qt</b>"));

}

//! [4]

//此函数将所有的菜单选项实体化

void MainWindow::createActions()

{

//! [5]

newAct = new QAction(tr("&New"), this);

newAct->setShortcuts(QKeySequence::New);//设置快捷键,标准的新建菜单快捷键

newAct->setStatusTip(tr("Create a new file"));//状态提示,status tip默认为空

connect(newAct, SIGNAL(triggered()), this, SLOT(newFile()));

//属性triggered : 触发。鼠标放在菜单上点击就可触发

//! [4]

openAct = new QAction(tr("&Open..."), this);

openAct->setShortcuts(QKeySequence::Open);

openAct->setStatusTip(tr("Open an existing file"));

connect(openAct, SIGNAL(triggered()), this, SLOT(open()));

//! [5]

saveAct = new QAction(tr("&Save"), this);

saveAct->setShortcuts(QKeySequence::Save);

saveAct->setStatusTip(tr("Save the document to disk"));

connect(saveAct, SIGNAL(triggered()), this, SLOT(save()));

printAct = new QAction(tr("&Print..."), this);

printAct->setShortcuts(QKeySequence::Print);

printAct->setStatusTip(tr("Print the document"));

connect(printAct, SIGNAL(triggered()), this, SLOT(print()));

exitAct = new QAction(tr("E&xit"), this);

exitAct->setShortcut(tr("Ctrl+Q"));//设置快捷键Ctr+Q

exitAct->setStatusTip(tr("Exit the application"));

connect(exitAct, SIGNAL(triggered()), this, SLOT(close()));

undoAct = new QAction(tr("&Undo"), this);

undoAct->setShortcuts(QKeySequence::Undo);

undoAct->setStatusTip(tr("Undo the last operation"));

connect(undoAct, SIGNAL(triggered()), this, SLOT(undo()));

redoAct = new QAction(tr("&Redo"), this);

redoAct->setShortcuts(QKeySequence::Redo);

redoAct->setStatusTip(tr("Redo the last operation"));

connect(redoAct, SIGNAL(triggered()), this, SLOT(redo()));

cutAct = new QAction(tr("Cu&t"), this);

cutAct->setShortcuts(QKeySequence::Cut);

cutAct->setStatusTip(tr("Cut the current selection's contents to the "

"clipboard"));

connect(cutAct, SIGNAL(triggered()), this, SLOT(cut()));

copyAct = new QAction(tr("&Copy"), this);

copyAct->setShortcut(tr("Ctrl+C"));

copyAct->setStatusTip(tr("Copy the current selection's contents to the "

"clipboard"));

connect(copyAct, SIGNAL(triggered()), this, SLOT(copy()));

pasteAct = new QAction(tr("&Paste"), this);

pasteAct->setShortcuts(QKeySequence::Paste);

pasteAct->setStatusTip(tr("Paste the clipboard's contents into the current "

"selection"));

connect(pasteAct, SIGNAL(triggered()), this, SLOT(paste()));

boldAct = new QAction(tr("&Bold"), this);

boldAct->setCheckable(true);//菜单选项有使能功能, 选项左端会有一个钩号。

boldAct->setShortcut(tr("Ctrl+B"));

boldAct->setStatusTip(tr("Make the text bold"));

connect(boldAct, SIGNAL(triggered()), this, SLOT(bold()));

QFont boldFont = boldAct->font();//返回bold的字体设置

boldFont.setBold(true);//设为粗体(bold)

boldAct->setFont(boldFont);//将修改过的字体属性返回

italicAct = new QAction(tr("&Italic"), this);

italicAct->setCheckable(true);//菜单选项有使能功能, 选项左端会有一个钩号。

italicAct->setShortcut(tr("Ctrl+I"));

italicAct->setStatusTip(tr("Make the text italic"));

connect(italicAct, SIGNAL(triggered()), this, SLOT(italic()));

QFont italicFont = italicAct->font();

italicFont.setItalic(true);//设置为斜体字

italicAct->setFont(italicFont);

setLineSpacingAct = new QAction(tr("Set &Line Spacing..."), this);

setLineSpacingAct->setStatusTip(tr("Change the gap between the lines of a "

"paragraph"));

connect(setLineSpacingAct, SIGNAL(triggered()), this, SLOT(setLineSpacing()));

setParagraphSpacingAct = new QAction(tr("Set &Paragraph Spacing..."), this);

setLineSpacingAct->setStatusTip(tr("Change the gap between paragraphs"));

connect(setParagraphSpacingAct, SIGNAL(triggered()),

this, SLOT(setParagraphSpacing()));

aboutAct = new QAction(tr("&About"), this);

aboutAct->setStatusTip(tr("Show the application's About box"));

connect(aboutAct, SIGNAL(triggered()), this, SLOT(about()));

aboutQtAct = new QAction(tr("About &Qt"), this);

aboutQtAct->setStatusTip(tr("Show the Qt library's About box"));

connect(aboutQtAct, SIGNAL(triggered()), qApp, SLOT(aboutQt()));//连接标准信号槽

connect(aboutQtAct, SIGNAL(triggered()), this, SLOT(aboutQt()));

leftAlignAct = new QAction(tr("&Left Align"), this);

leftAlignAct->setCheckable(true);//可选的菜单

leftAlignAct->setShortcut(tr("Ctrl+L"));

leftAlignAct->setStatusTip(tr("Left align the selected text"));

connect(leftAlignAct, SIGNAL(triggered()), this, SLOT(leftAlign()));

rightAlignAct = new QAction(tr("&Right Align"), this);

rightAlignAct->setCheckable(true);//可选的菜单

rightAlignAct->setShortcut(tr("Ctrl+R"));

rightAlignAct->setStatusTip(tr("Right align the selected text"));

connect(rightAlignAct, SIGNAL(triggered()), this, SLOT(rightAlign()));

justifyAct = new QAction(tr("&Justify"), this);

justifyAct->setCheckable(true);

justifyAct->setShortcut(tr("Ctrl+J"));

justifyAct->setStatusTip(tr("Justify the selected text"));

connect(justifyAct, SIGNAL(triggered()), this, SLOT(justify()));

centerAct = new QAction(tr("&Center"), this);

centerAct->setCheckable(true);

centerAct->setShortcut(tr("Ctrl+E"));

centerAct->setStatusTip(tr("Center the selected text"));

connect(centerAct, SIGNAL(triggered()), this, SLOT(center()));

//! [6] //! [7]

//QActionGroup的作用就是将多个相似的动作组合在一起。

//QActionGroup默认为单选模式,一次只能选择一个选项。

alignmentGroup = new QActionGroup(this);

alignmentGroup->addAction(leftAlignAct);

alignmentGroup->addAction(rightAlignAct);

alignmentGroup->addAction(justifyAct);

alignmentGroup->addAction(centerAct);

leftAlignAct->setChecked(true);

//! [6]

}

//! [7]

//! [8]

//将菜单实体化

void MainWindow::createMenus()

{

//! [9] //! [10]

//QMainWindow has its own layout to which you can add QToolBars,

//QDockWidgets, a QMenuBar, and a QStatusBar.

fileMenu = menuBar()->addMenu(tr("&File"));//实体化“File”

fileMenu->addAction(newAct);

//! [9]

fileMenu->addAction(openAct);

//! [10]

fileMenu->addAction(saveAct);

fileMenu->addAction(printAct);

//! [11]

fileMenu->addSeparator();//添加菜单隔离

//! [11]

fileMenu->addAction(exitAct);

editMenu = menuBar()->addMenu(tr("&Edit"));//实体化“Edit”

editMenu->addAction(undoAct);

editMenu->addAction(redoAct);

editMenu->addSeparator();//添加菜单隔离

editMenu->addAction(cutAct);

editMenu->addAction(copyAct);

editMenu->addAction(pasteAct);

editMenu->addSeparator();//添加菜单隔离

helpMenu = menuBar()->addMenu(tr("&Help"));//实体化“Help”

helpMenu->addAction(aboutAct);

helpMenu->addAction(aboutQtAct);

//! [8]

//! [12]

formatMenu = editMenu->addMenu(tr("&Format"));

formatMenu->addAction(boldAct);

formatMenu->addAction(italicAct);

formatMenu->addSeparator()->setText(tr("Alignment"));

//QActionGroup只是将四个按钮的值联系起来,添加按钮仍要分别添加而不能整体添加

formatMenu->addAction(leftAlignAct);

formatMenu->addAction(rightAlignAct);

formatMenu->addAction(justifyAct);

formatMenu->addAction(centerAct);

formatMenu->addSeparator();

formatMenu->addAction(setLineSpacingAct);

formatMenu->addAction(setParagraphSpacingAct);

}

//! [12]

/**********************************************************/

#include <QApplication>

#include "mainwindow.h"

int main(int argc, char *argv[])

{

QApplication app(argc, argv);

MainWindow window;

window.show();

return app.exec();

}

你可能感兴趣的:(J#,qt,360)