QT的添加动作

38 篇文章 1 订阅
32 篇文章 0 订阅

主窗口的H文件

#ifndef QTTEST_H
#define QTTEST_H
#include <QtWidgets/QMainWindow>
#include "ui_qttest.h"


class QTTest : public QMainWindow
{
Q_OBJECT


public:
QTTest(QWidget *parent = 0);
~QTTest();


private:
void Open(); 


QAction  *openAction; 


Ui::QTTestClass ui;


};


#endif // QTTEST_H


主窗口的C文件的实现 


#include <QAction>
#include <QMenuBar>
#include <QMessageBox>
#include <QStatusBar>
#include <QToolBar>
#include "qttest.h"


QTTest::QTTest(QWidget *parent)
: QMainWindow(parent)
{
setWindowTitle(tr("Mian Window"));
openAction = new QAction(QIcon(":/images/openfileIcon"),tr("&Open..."), this);

openAction->setShortcut(QKeySequence::Open);
openAction->setStatusTip(tr(" Open existed file "));

connect(openAction, &QAction::triggered, this, &QTTest::Open);

QMenu *file = menuBar()->addMenu(tr("&File"));
file->addAction(openAction);


QToolBar *toolBar = addToolBar(tr("&File"));
toolBar->addAction(openAction);


statusBar();


//ui.setupUi(this);

}

QTTest::~QTTest()
{
}

void QTTest::Open()
{
QMessageBox::information(this, tr("Information"), tr("Open"));

}

上面的代码分别属于两个文件:mainwindow.h 和 mainwindow.cpp。为了让 MainWindow 运行起来,我们还需要修改 main() 函数如下:

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
QTTest win; 
win.show();
    return app.exec();
}

当我们编辑好文件,点击运行,可以看到MainWindow的运行结果:

Main Window with Action

这是一个相对完整的程序。首先,我们在MainWindow类中添加了一个私有函数open()和一个私有变量openAction。在 MainWindow 的构造函数中,第一行我们调用了setWindowTitle(),设置主窗口的标题。注意我们的文本使用tr()函数,这是一个用于 Qt 国际化的函数。在后续章节中我们可以看到,我们可以使用 Qt 提供的国际化工具,将tr()函数的字符串提取出来,进行国际化。由于所需进行国际化的文本应该被大多数人认识,所以,tr()函数里面一般会是英文文本。

然后,我们在堆上创建了openAction对象。在QAction构造函数,我们传入了一个图标、一个文本和 this 指针。我们将在后面的文章中解释 this 指针的含义。

图标我们使用了QIcon,传入值是一个字符串,这个字符串对应于 Qt 资源文件中的一段路径。Qt 资源文件的后缀名是 qrc。如果我们使用 Qt Creator,我们可以在新建文件中看到 Qt 资源文件。Qt 资源文件其实是一个 XML 描述的文件,表示 Qt 应用程序所需要的各个资源。我们可以使用普通文本编辑器打开这个文件:

我们会在后面的章节中详细介绍 Qt 资源文件(注意,资源文件需要在 pro 文件中使用 RESOURCES 引入。)。这里只需要了解,QIcon的参数,以 : 开始,意味着从资源文件中查找资源。:/images/doc-open就是找到了这里的 document-open.png 这个文件。(我们使用的是 png 格式的图片,这是 Qt 内置支持的图片格式。其他格式的图片,比如 jpg、gif 则需要插件支持。这些插件实际已经随着 Qt 一同发布。)

QAction第二个参数中,文本值前面有一个 &,意味着这将成为一个快捷键。注意看截图中 File 的 F 有一个下划线。

下面一句,我们使用了setShortcut()函数,用于说明这个QAction的快捷键。Qt 的QKeySequence为我们定义了很多内置的快捷键,比如我们使用的 Open。你可以通过查阅 API 文档获得所有的快捷键列表。 这个与我们自己定义的有什么区别呢?简单来说,我们完全可以自己定义一个tr("Ctrl+O")来实现快捷键。原因在于,这是 Qt 跨平台性的体现。比如 PC 键盘和 Mac 键盘是不一样的,一些键在 PC 键盘上有,而 Mac 键盘上可能并不存在,或者反之。使用QKeySequence类来添加快捷键,会根据平台的不同来定义相应的快捷键。

setStatusTip()则实现了当用户鼠标滑过这个 action 时,会在主窗口下方的状态栏显示相应的提示。

后面的connect()函数,将这个QActiontriggered()信号与MainWindow类的open()函数连接起来。当用户点击了这个QAction时,会自动触发MainWindowopen()函数。这是我们之前已经了解过的。

下面的menuBar()toolBar()statusBar()三个是QMainWindow的函数,用于创建并返回菜单栏、工具栏和状态栏。我们可以从代码清楚地看出,我们向菜单栏添加了一个 File 菜单,并且把这个QAction对象添加到这个菜单;同时新增加了一个 File 工具栏,也把QAction对象添加到了这个工具栏。我们可以看到,在菜单中,这个对象被显示成一个菜单项,在工具栏变成了一个按钮。至于状态栏,则是出现在窗口最下方,用于显示动作对象的提示信息的。

至于open()函数中的内容,我们会在后文介绍。这里可以运行一下,你会看到,触发这个动作,程序会弹出一个提示框。

类似的QT4的实现 



// !!! Qt 4
// ========== mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H


#include <QMainWindow>


class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
~MainWindow();


private slots:
void open();


private:
QAction *openAction;
};


#endif // MAINWINDOW_H


// ========== mainwindow.cpp
#include <QAction>
#include <QMenuBar>
#include <QMessageBox>
#include <QToolBar>


#include "mainwindow.h"


MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent)
{
setWindowTitle(tr("Main Window"));


openAction = new QAction(QIcon(":/images/doc-open"), tr("&Open..."), this);
openAction->setShortcuts(QKeySequence::Open);
openAction->setStatusTip(tr("Open an existing file"));
connect(openAction, SIGNAL(triggered()), this, SLOT(open()));


QMenu *file = menuBar()->addMenu(tr("&File"));
file->addAction(openAction);


QToolBar *toolBar = addToolBar(tr("&File"));
toolBar->addAction(openAction);


statusBar();
}


MainWindow::~MainWindow()
{
}


void MainWindow::open()
{
QMessageBox::information(this, tr("Information"), tr("Open"));
}

// !!! Qt 4
// ========== mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H


#include <QMainWindow>


class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
~MainWindow();


private slots:
void open();


private:
QAction *openAction;
};


#endif // MAINWINDOW_H


// ========== mainwindow.cpp
#include <QAction>
#include <QMenuBar>
#include <QMessageBox>
#include <QToolBar>


#include "mainwindow.h"


MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent)
{
setWindowTitle(tr("Main Window"));


openAction = new QAction(QIcon(":/images/doc-open"), tr("&Open..."), this);
openAction->setShortcuts(QKeySequence::Open);
openAction->setStatusTip(tr("Open an existing file"));
connect(openAction, SIGNAL(triggered()), this, SLOT(open()));


QMenu *file = menuBar()->addMenu(tr("&File"));
file->addAction(openAction);


QToolBar *toolBar = addToolBar(tr("&File"));
toolBar->addAction(openAction);


statusBar();
}


MainWindow::~MainWindow()
{
}


void MainWindow::open()
{
QMessageBox::information(this, tr("Information"), tr("Open"));
}

// !!! Qt 4
// ========== mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H


#include <QMainWindow>


class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
~MainWindow();


private slots:
void open();


private:
QAction *openAction;
};


#endif // MAINWINDOW_H


// ========== mainwindow.cpp
#include <QAction>
#include <QMenuBar>
#include <QMessageBox>
#include <QToolBar>


#include "mainwindow.h"


MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent)
{
setWindowTitle(tr("Main Window"));


openAction = new QAction(QIcon(":/images/doc-open"), tr("&Open..."), this);
openAction->setShortcuts(QKeySequence::Open);
openAction->setStatusTip(tr("Open an existing file"));
connect(openAction, SIGNAL(triggered()), this, SLOT(open()));


QMenu *file = menuBar()->addMenu(tr("&File"));
file->addAction(openAction);


QToolBar *toolBar = addToolBar(tr("&File"));
toolBar->addAction(openAction);


statusBar();
}


MainWindow::~MainWindow()
{
}


void MainWindow::open()
{
QMessageBox::information(this, tr("Information"), tr("Open"));
}




  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值