QTableWidget右键菜单 QFileDialog

4.为表格数据添加右键菜单

有时候我们想通过点击鼠标右键对表格数据进行一些其他操作,比如复制、查看详情等,我们可以按照下面的方法来实现。为了实现点击右键弹出菜单这个功能,我们必须在类studentInfo类中声明一个菜单变量popMenu和一个菜单选项变量action。

class studentInfo : public QMainWindow
{
…………
private:
    Ui::studentInfo *ui;
    QMenu *popMenu;
    QAction *action;

private slots:
    void on_stuTableWidget_customContextMenuRequested(QPoint pos);
…………
};

声明完毕后,我们在studentInfo类的构造函数中对其进行初始化,如下:

    ui->stuTableWidget->setContextMenuPolicy(Qt::CustomContextMenu);
    popMenu = new QMenu(ui->stuTableWidget);
    action = new QAction("Copy", this);

setContextMenuPolicy方法用来设置widget菜单项的显示方法,而CustomContextMenu是唯一与邮件菜单有关的参数,因此这里我们将菜单显示方法设置为该类型。如果widget设置为CustomContextMenu时,当在数据上点击右键时就会发送customContextMenuRequested ( const QPoint & pos )信号,该信号还会捕捉到点击右键的位置,并用pos参数来存储。与此信号关联的槽函数我们定义如下:

void studentInfo::on_stuTableWidget_customContextMenuRequested(QPoint pos)
{
    popMenu->addAction(action);
    popMenu->exec(QCursor::pos());
}

我们首先将菜单选项action添加到邮件弹出菜单popMenu中,再通过exec方法在pos()位置显示该邮件菜单,pos()返回的位置即为点击鼠标的位置。

现在,如果点击右键菜单选项并不会发生任何动作,这是因为我们并没有关联相应的槽函数。由于具体的菜单选项不同,其函数的实现也不同,这里我们只给出框架,如下:

void studentInfo::rightClickedOperation()
{
    //do something
}

定义好槽函数,最关键的是与相应的信号连接。对于上述两个槽函数,我们可以使用两种方法进行信号和槽的关联:在Qt Desinger模式下添加或手动进行connect关联。对于customContextMenuRequested信号,我们使用前种方法实现信号和槽的关联;对于右键菜单选项的功能实现,我们可以通过connect函数实现,如下:

connect(action, SIGNAL(triggered()), this, SLOT(rightClickedOperation()));
 
 

《Qt学习之路》已经写到了第15篇,然而现在再写下去却有点困难,原因是当初并没有想到会连续的写下去,因此并没有很好的计划这些内容究竟该怎样去写。虽然前面说过,本教程主要线路参考《C++ Gui Programming with Qt 4, 2nd Edition》,然而最近的章节由于原文是一个比较完整的项目而有所改变,因此现在不知道该从何写起。

我并不打算介绍很多组件的使用,因为Qt有很多组件,各种组件用法众多,根本不可能介绍完,只能把API放在手边,边用边查。所以,对于很多组件我只是简单的介绍一下,具体用法还请自行查找(确切地说,我知道的也并不多,很多时候还是要到API里面去找)。

下面还是按照我们的进度,从Qt的标准对话框开始说起。所谓标准对话框,其实就是Qt内置的一些对话框,比如文件选择、颜色选择等等。今天首先介绍一下QFileDialog。

QFileDialog是Qt中用于文件打开和保存的对话框,相当于Swing里面的JFileChooser。下面打开我们前面使用的工程。我们已经很有先见之明的写好了一个打开的action,还记得前面的代码吗?当时,我们只是弹出了一个消息对话框(这也是一种标准对话框哦~)用于告知这个信号槽已经联通,现在我们要写真正的打开代码了!

修改MainWindow的open函数:

void MainWindow :: open ( ) { QString path = QFileDialog :: getOpenFileName ( this, tr ( "Open Image" ), ".", tr ( "Image Files(*.jpg *.png)" ) ) ; if (path. length ( ) == 0 ) { QMessageBox :: information ( NULL, tr ( "Path" ), tr ( "You didn't select any files." ) ) ; } else { QMessageBox :: information ( NULL, tr ( "Path" ), tr ( "You selected " ) + path ) ; } }

编译之前别忘记include QFileDialog哦!然后运行一下吧!点击打开按钮,就会弹出打开对话框,然后选择文件或者直接点击取消,会有相应的消息提示。

QFileDialog提供了很多静态函数,用于获取用户选择的文件。这里我们使用的是getOpenFileName(), 也就是“获取打开文件名”,你也可以查看API找到更多的函数使用。不过,这个函数的参数蛮长的,而且类型都是QString,并不好记。考虑到这种情况,Qt提供了另外的写法:

QFileDialog *fileDialog = new QFileDialog ( this ) ; fileDialog - &gt ;setWindowTitle (tr ( "Open Image" ) ) ; fileDialog - &gt ;setDirectory ( "." ) ; fileDialog - &gt ;setFilter (tr ( "Image Files(*.jpg *.png)" ) ) ; if (fileDialog - &gt ;exec ( ) == QDialog :: Accepted ) { QString path = fileDialog - &gt ;selectedFiles ( ) [ 0 ] ; QMessageBox :: information ( NULL, tr ( "Path" ), tr ( "You selected " ) + path ) ; } else { QMessageBox :: information ( NULL, tr ( "Path" ), tr ( "You didn't select any files." ) ) ; }

不过,这两种写法虽然功能差别不大,但是弹出的对话框却并不一样。getOpenFileName()函数在Windows和MacOS X平台上提供的是本地的对话框,而QFileDialog提供的始终是Qt自己绘制的对话框(还记得前面说过,Qt的组件和Swing类似,也是自己绘制的,而不都是调用系统资源API)。

为了说明QFileDialog::getOpenFileName()函数的用法,还是先把函数签名放在这里:

QString QFileDialog :: getOpenFileName ( QWidget * parent = 0, const QString &amp ; caption = QString ( ), const QString &amp ; dir = QString ( ), const QString &amp ; filter = QString ( ), QString * selectedFilter = 0, Options options = 0 )

第一个参数parent,用于指定父组件。注意,很多Qt组件的构造函数都会有这么一个parent参数,并提供一个默认值0;

第二个参数caption,是对话框的标题;

第三个参数dir,是对话框显示时默认打开的目录,”.” 代表程序运行目录,”/” 代表当前盘符的根目录(Windows,Linux下/就是根目录了),也可以是平台相关的,比如”C:\\”等;

第四个参数filter,是对话框的后缀名过滤器,比如我们使用”Image Files(*.jpg *.png)”就让它只能显示后缀名是jpg或者png的文件。如果需要使用多个过滤器,使用”;;”分割,比如”JPEG Files(*.jpg);;PNG Files(*.png)”;

第五个参数selectedFilter,是默认选择的过滤器;

第六个参数options,是对话框的一些参数设定,比如只显示文件夹等等,它的取值是enum QFileDialog::Option,每个选项可以使用 | 运算组合起来。

如果我要想选择多个文件怎么办呢?Qt提供了getOpenFileNames()函数,其返回值是一个QStringList。你可以把它理解成一个只能存放QString的List,也就是STL中的list<string>。

好了,我们已经能够选择打开文件了。保存也是类似的,QFileDialog类也提供了保存对话框的函数getSaveFileName,具体使用还是请查阅API。

本文出自 “豆子空间” 博客,请务必保留此出处http://devbean.blog.51cto.com/448512/213414

QFileDialog Class Reference QFileDialog类提供了允许用户选择文件或者目录的对话框. 构造函数 QFileDialog::QFileDialog(const QString &dirName,const QString &filter=QString::null,QWidget *parent=0,const char *name=0,bool modal=FALSE) 构造父对象为parent名称为name为文件选择对话框,dirName指定工作目录,filter指定过滤器,modal为真则为模式对话框否则为非模式 QFileDialog::QFileDialog(QWidget *parent=0,const char *name=0,bool modal=FALSE) 构造父对象为parent名称为name的文件对话框,如果modal为真则为模式否则为非模式 QFileDialog::~QFileDialog() 析构该对话框 void QFileDialog::addFilter(const QString &filter) 添加过滤器并作为当前过滤器 void QFileDialog::addLeftWidget(QWidget *w) 添加左窗口部件 void QFileDialog::addRightWidget(QWidget *w) 添加右窗口部件 void QFileDialog::addToolButton(QButton *b,bool separator=FALSE) 添加工具按钮(separator决定分隔线) void QFileDialog::addWidgets(QLabel *l,QWidget *w,QPushButton *b) 将指定的窗口部件添加到文件对话框底部 const QDir *QFileDialog::dir() const 返回文件对话框中显示的当前目录 void QFileDialog::dirEntered(const QString &)信号 当用户进入一个目录时该信号被发射 QString QFileDialog::dirPath() const 返回当前工作目录 void QFileDialog::fileHightlighted(const QString &)信号 当用户高亮显示一个文件时该信号被发射 void QFileDialog::fileSelected(const QString &)信号 当用户选择一个文件时该信号被发射 void QFileDialog::fileSelected(const QStringList &)信号 当用户在ExistingFiles模式下选择一个或多个文件时该信号被发射 void QFileDialog::filterSelected(const QString &)信号 当用户选择一个过滤器时该信号被发射 静态函数 QString QFileDialog::getExistingDirectory(const QString &dir=QString::null,QWidget *parent=0,const char *name=0,const QString &caption=QString::null,bool dirOnly=TRUE,bool resolveSymlinks=TRUE)静态 返回由用户选择的已经存在的目录的静态构造函数 QString QFileDialog::getOpenFileName(const QString &startWith=QString::null,const QString &filter=QString::null,QWidget *parent=0,const char *name=0,const QString &caption=QString::null,QString *selectedFilter=0,bool resolveSymlinks=TRUE)静态 返回用户选择的文件名(包括路径) QStringList QFileDialog::getOpenFileNames ( const QString & filter = QString::null, const QString & dir = QString::null, QWidget * parent = 0, const char * name = 0, const QString & caption = QString::null, QString * selectedFilter = 0, bool resolveSymlinks = TRUE ) [静态] 返回用户选择的文件列表 QString QFileDialog::getSaveFileName ( const QString & startWith = QString::null, const QString & filter = QString::null, QWidget * parent = 0, const char * name = 0, const QString & caption = QString::null, QString * selectedFilter = 0, bool resolveSymlinks = TRUE ) [静态] 返回用户输入的欲保存的文件名 QFileIconProvider *QFileDialog::iconProvider() 静态 返回当前设置的图标提供者的指针 bool QFileDialog::isContentsPreviewEnabled()const 如果文件对话框提供当前选择文件的内容预览返回真否则返回假 bool QFileDialog::isInfoPreviewEnabled()const 如果提供当前选择文件的信息预览返回真否则返回假 Mode QFileDialog::mode () const 返回文件对话框的模式 PreviewMode QFileDialog::previewMode () const 返回对话框的预览模式 void QFileDialog::rereadDir() 重新读取在文件对话框中显示的当前目录 void QFileDialog::resortDir() 重新排列所显示的目录 void QFileDialog::selectAll(bool b) 如果b为真则选择所有文件否则取消选择 QString QFileDialog::selectedFile()const 返回选择文件的名称 QStringList QFileDialog::selectedFiles()const 返回选择文件的列表 QString QFileDialog::selectedFilter() const 返回选择的过滤器 void QFileDialog::setDir(const QDir &dir) 设置工作目录 void QFileDialog::setFilter(const QString &newFilter)槽 设置文件对话框过滤器 void QFileDialog::setFilters(const QString &filters)槽 设置过滤器,每一组必须用;;两个分号分隔 void QFileDialog::setFilters(const char **types)槽 设置过滤器,必须是以结束符结尾的字符串列表 void QFileDialog::setFilters ( const QStringList & ) 设置过滤器 void QFileDialog::setIconProvider ( QFileIconProvider * provider ) [静态] 设置图标提供者 void QFileDialog::setInfoPreview ( QWidget * w, QFilePreview * preview ) 设置显示文件信息的窗口部件为w并且用QFilePreview preview来预览信息 void QFileDialog::setInfoPreviewEnabled (bool) 设置是否提供选择文件的信息预览 void QFileDialog::setMode(Mode) 设置模式 QFileDialog::AnyFile 文件名称,不论是否存在 QFileDialog::ExistingFile一个单一存在文件的名称 QFileDialog::Directory 目录名称,文件和目录都被显示 QFileDialog::ExistingFiles void QFileDialog::setPreviewMode ( PreviewMode m ) 设置文件对话框的预览模式为m QFileDialog::NoPreview 没有预览被显示 QFileDialog::Contents 内容预览窗口 QFileDialog::Info 信息预览窗口 ViewMode QFileDialog::viewMode () const 返回文件对话框的视图模式 QUrl QFileDialog::url()const 返回当前工作目录的URL bool QFileDialog::showHiddenFiles()const 如果隐藏文件被显示返回真否则返回假 void QFileDialog::setViewMode(ViewMode m) 设置视图模式为m void QFileDialog::setUrl(const QUrlOperator &url) 设置工作目录为url指定的目录 void QFileDialog::setSelection(const QString &filename) 设置默认选择为filename如果filename为绝对的,setDir()也会被调用来设置文件对话框的工作目录为filename中的目录 void QFileDialog::setSelectedFilter(int n) 设置文件对话框中当前选择的过滤器列表中的第n个过滤器 void QFileDialog::setSelectedFilter(const QString &mask) 设置当前选择的过滤器为文件mask中包含的第一个 void QFileDialog::setShowHiddenFiles(bool s) 设置隐藏文件是否被显示 属性文档 bool contentsPreview是否提供当前选择文件的内容预览 QString dirPath工作目录 bool infoPreview 是否提供当前选择文件的信息预览 QString selectedFile选择文件的名称 QStringList selectedFiles选择文件的列表 QString selectedFilter 用户选择的过滤器 bool showHiddenFiles 文件对话框中隐藏文件是否显示 ViewMode viewMode 文件对话框的视图模式 QFileDialog::List 列表视图模式 QFileDialog::Detail 详细视图模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值