Qt 使用QAction
类作为动作。这个动作可能显示在菜单,作为一个菜单项,当用户点击该菜单项,对用户的点击做出响应;也可能在工具栏,作为一个工具栏按钮,用户点击这个按钮就可以执行相应的操作。
具体示例代码:
1 // !!! Qt 5 2 // ========== mainwindow.h 3 #ifndef MAINWINDOW_H 4 #define MAINWINDOW_H 5 6 #include7 8 class MainWindow : public QMainWindow 9 {10 Q_OBJECT11 public:12 MainWindow(QWidget *parent = 0);13 ~MainWindow();14 15 private:16 void open();17 18 QAction *openAction;19 };20 21 #endif // MAINWINDOW_H22 23 // ========== mainwindow.cpp24 #include 25 #include 26 #include 27 #include 28 #include 29 30 #include "mainwindow.h"31 32 MainWindow::MainWindow(QWidget *parent) :33 QMainWindow(parent)34 {35 setWindowTitle(tr("Main Window"));36 37 openAction = new QAction(QIcon(":/images/doc-open"), tr("&Open..."), this);38 openAction->setShortcuts(QKeySequence::Open);39 openAction->setStatusTip(tr("Open an existing file"));40 connect(openAction, &QAction::triggered, this, &MainWindow::open);41 42 QMenu *file = menuBar()->addMenu(tr("&File"));43 file->addAction(openAction);44 45 QToolBar *toolBar = addToolBar(tr("&File"));46 toolBar->addAction(openAction);47 48 statusBar() ;49 }50 51 MainWindow::~MainWindow()52 {53 }54 55 void MainWindow::open()56 {57 QMessageBox::information(this, tr("Information"), tr("Open"));58 }
main函数:
1 #include "mainwindow.h" 2 #include3 4 int main(int argc, char *argv[]) 5 { 6 QApplication app(argc, argv); 7 8 MainWindow win; 9 win.show();10 11 return app.exec();12 }
第37行,我们在堆上创建了openAction
对象。在QAction
构造函数,我们传入了一个图标、一个文本和 this 指针。
openAction = new QAction(QIcon(":/images/doc-open"), tr("&Open..."), this);
图标我们使用了QIcon
,传入值是一个字符串,这个字符串对应于 Qt 资源文件中的一段路径。(注:这个路径在我的qt5.9.2中是不存在的,这导致了原来的地方没有了图标,不知道是不是由于版本差异导致与原作者不同。)
第38行,我们使用了setShortcut()
函数,用于说明这个QAction
的快捷键。
openAction->setShortcuts(QKeySequence::Open);
Qt 的QKeySequence
为我们定义了很多内置的快捷键,比如我们使用的 Open。你可以通过查阅 API 文档获得所有的快捷键列表。 这个与我们自己定义的有什么区别呢?简单来说,我们完全可以自己定义一个tr("Ctrl+O")
来实现快捷键。原因在于,这是 Qt 跨平台性的体现。比如 PC 键盘和 Mac 键盘是不一样的,一些键在 PC 键盘上有,而 Mac 键盘上可能并不存在,或者反之。使用QKeySequence
类来添加快捷键,会根据平台的不同来定义相应的快捷键。
39行,setStatusTip()则实现了当用户鼠标滑过这个 action 时,会在主窗口下方的状态栏显示相应的提示。
openAction->setStatusTip(tr("Open an existing file"));
40行的connect()函数,将这个QAction
的triggered()
信号与MainWindow
类的open()
函数连接起来。当用户点击了这个QAction
时,会自动触发MainWindow
的open()
函数。
connect(openAction, &QAction::triggered, this, &MainWindow::open);
42-43行:
QMenu *file = menuBar()->addMenu(tr("&File")); file->addAction(openAction);
向菜单栏添加了一个 File 菜单,并且把这个QAction
对象添加到这个菜单。
45-46行:
QToolBar *toolBar = addToolBar(tr("&File")); toolBar->addAction(openAction);
新增加了一个 File 工具栏,也把QAction
对象添加到了这个工具栏。
48行的statusBar()则是创建了一个状态栏。
具体的内容可能会在后文学到。
原文:https://www.devbean.net/2012/08/qt-study-road-2-action/