Qt编程之实现在QFileDialog上添加自定义的widget

上网搜索找到的方法如下:

http://www.qtforum.org/article/20841/how-to-add-a-qwidget-in-qfiledialog.html#post78422

http://www.qtcentre.org/threads/42858-Creating-a-Custom-FileOpen-Dialog

http://stackoverflow.com/questions/16987916/add-widgets-to-qfiledialog

其实前两个链接里面提供的方法我都试了,行不通,这些方法都是直接在QFileDialog上添加widget,首先都得获得QFileDialog的layout,估计是他们用的是以前Qt的版本吧,反正5.0.0以上的版本是没有用了,用了直接程序会Abort。这个他们说了也不推荐用。因为Qt版本内部的数据结构是不断变化的。

所以以下我采用了一种巧妙的方式,绕过了直接在QFileDialog上添加widget,实质上是自己创建一个QDialog,把QFileDialog作为一个widget添加到QDialog里面。

以下是Demo:

myFileDlg.h

 1 #ifndef MY_FILE_DIALOG_H
 2 #define  MY_FILE_DIALOG_H
 3 #include <QLineEdit>
 4 #include <QDialog>
 5 /*class MyFileDialog : public QFileDialog
 6 {
 7 public:
 8     MyFileDialog(QWidget *parent);
 9 private:
10     QLineEdit *line_edit;
11     QFileDialog *p;
12 };*/
13
14 class Dialog : public QDialog
15 {
16
17 public:
18     Dialog(QWidget *parent = 0);
19     QFileDialog* GetFileDlg()
20     {
21         return m_filedlg;
22     }
23
24
25 private:
26
27     QFileDialog *m_filedlg ;
28     QLabel *textLabel;
29     QLineEdit *textEdit ;
30
31     QGridLayout *mainLayout ;
32
33     QString openFilesPath;
34
35 };
36
37
38
39
40 #endif

myFileDlg.cpp

 1 #include <QWidget>
 2 #include <QGridLayout>
 3 #include <QFileDialog>
 4 #include <assert.h>
 5 #include <QHBoxLayout>
 6 #include <QVBoxLayout>
 7 #include <QLabel>
 8 #include <QDialog>
 9
10 #include "myFileDlg.h"
11
12
13
14 Dialog::Dialog(QWidget *parent): QDialog(parent)
15 {
16
17     /***********************************************************/
18
19     QFileDialog *m_filedlg = new QFileDialog(this,Qt::SubWindow);
20
21     m_filedlg->setOption(QFileDialog::DontUseNativeDialog,true);
22
23     if(m_filedlg->testOption(QFileDialog::DontUseNativeDialog))
24         printf("cuccee\n");
25
26
27
28     //m_filedlg ->getOpenFileName(0,"Select File","D:\\","Video Files (*.avi *.mpg);;3D STL Files (*.stl)",NULL,QFileDialog::DontUseNativeDialog);
29
30
31
32     //m_filedlg->setWindowFlags(Qt::SubWindow) ;
33
34     /***********************************************************/
35
36     textLabel = new QLabel( tr(" StepX: ") );
37     textEdit  = new QLineEdit();
38
39     mainLayout = new QGridLayout(this);
40
41
42     mainLayout->addWidget( m_filedlg , 0 , 0 , 2 , 1  ) ;
43     mainLayout->addWidget( textLabel , 2 , 0 , 1 , 1  ) ;
44     mainLayout->addWidget(textEdit ,   2 , 1 , 1 , 1  ) ;
45
46
47     /***********************************************************/
48
49     //setMinimumHeight( 400 ) ;
50     //setMinimumWidth( 600 ) ;
51
52     setSizePolicy( QSizePolicy( QSizePolicy::Expanding , QSizePolicy::Expanding )  ) ;
53
54     setLayout(mainLayout);
55
56
57 }

main.cpp

 1 #include <stdio.h>
 2 #include <QApplication>
 3 #include <QString>
 4 #include <QtCore/QtPlugin>
 5 #include <QFileDialog>
 6 #include <QLabel>
 7 #include <QLineEdit>
 8 #include <QGridLayout>
 9 #include "myFileDlg.h"
10
11
12 int main(int argc, char* argv[])
13 {
14     Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin);//之前上一篇文章有描述过这个问题,必须要加入这行,不然不起作用。运行时会出错,http://www.cnblogs                                                   //.com/foohack/p/3909320.html
15     QApplication app(argc,argv);
16
17
18
19
20
21
22
23
24      Dialog *dialog =new Dialog(0);
25
26     // dlg ->getOpenFileName(0,"Select File","D:\\","Video Files (*.avi *.mpg);;3D STL Files (*.stl)",NULL);
27      dialog->setWindowTitle("Select BIG Image File");
28      dialog->setModal(true);
29      //dialog->show( ) ;
30
31      dialog->exec();
32     return app.exec();
33
34
35
36 }

Qt编程之实现在QFileDialog上添加自定义的widget

时间: 2024-08-29 18:37:05

Qt编程之实现在QFileDialog上添加自定义的widget的相关文章

Qt编程获取鼠标移动事件

想做下面一个效果:想当鼠标移动到按钮上的时候,按钮就变大,图标换个大的,鼠标不在按钮上的时候,按钮就变小,图标也换成小的,感觉比较Cool 实现原理:为每个按钮设置监听属性 void MainHomeForm::init() { //为按钮注册事件 ui->SystemSetButton->installEventFilter(this); ui->ZoneSetButton->installEventFilter(this); } //系统监听器监听按钮对象 bool MainH

【Qt编程】自动补全功能

最近写了一个查单词的类似有道词典的软件,里面就有一个自动补全功能(即当你输入一个字母时,就会出现几个候选项).这个自动补全功能十分常见,百度搜索关键词时就会出现.不过它们这些补全功能都是与你输入的进行首字匹配,有时也会不方便.例如,如果我输入一个"好",如果是首字匹配的话会出现下图: 如果是句中匹配的话,则是这种情况: 你可以根据自己的要求进行选择哪一种模式. Qt中自带QCompleter类来实现上面的自动补全功能,读者可以在Qt自带的demo中很容易的学会该类的使用.下面我要讲的是

Qt编程16:Qt向导简单使用(QWizard及QWizardPage)

关于Qt向导的使用,在Qt4.8.1以及4Q5.2.1中存在一个简单的例子,实现方式与我的方式有所不同. 在原有的例子中,使用了三个方法,分别定义了三个向导页:然后在main函数中将三个向导页通过addPage的方法加入向导. 如此比较简单实现,但是我觉得不够灵活.最后是将三个向导页分别继承QWizardPage,因为会涉及到每个向导页的一些操作.在这里也是基础. mywizard.h #ifndef MYWIZARD_H #define MYWIZARD_H #include <QWizard

QT笔记(1)--QT编程环境搭建

一.QT简介 Qt  是一个1991年由奇趣科技开发的跨平台C++图形用户界面应用程序开发框架.它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器.Qt是面向对象的框架,使用特殊的代码生成扩展(称为元对象编译器(Meta Object Compiler, moc))以及一些宏,易于扩展,允许组件编程.2008年,奇趣科技被诺基亚公司收购,QT也因此成为诺基亚旗下的编程语言工具.2012年,Qt被Digia收购.2014年4月,跨平台集成开发环境Qt Creator 3.1.

【Qt编程】html特殊字符及正则表达式

1.html特殊字符的显示 我们知道html语言和C语言一样也有一些特殊字符,它们是不能正常显示的,必须经过转义,在网上可以查到如何显示这些字符,如下图所示: 上图给了最常用的特殊字符的显示,下面我们来实验一下: 首先在记事本中写入一句: <font color=blue>程序例</font>#include<stdio.h> 然后就文本后缀名改为.html后,用浏览器打开,显示如下: 我们从上图可以发现include后面没有显示,但是当我们在文本中写入: <fo

Qt编程简介与基本知识

1. 什么是Qt? Qt是一个基于C++的跨平台应用程序和UI开发框架.它包含一个类库,和用于跨平台开发及国际化的工具. 由挪威Trolltech公司开发,后被Nokia收购,目前被Digia公司收购. 2. Qt的特性? 一次编程,到处编译 3. Qt的产生 4. Qt的发行版本 Qt商业版:提供给商业软件开发.它们提供传统商业软件发行版并且提供在协议有效期内的免费升级和技术支持服务. Qt开源版:仅仅为了开发自由和开放源码软件,提供了和商业版本同样的功能.GNU通用公共许可证下,它是免费的.

【Qt编程】音频播放

在上一篇文章中,我是在Qt4平台上调用本地发音的,后来由于用到JSON解析,就将平台转到了Qt5,因为Qt5自带解析JSON的类.然后发现上一篇文章的方法无法运行,当然网上可以找到解决方法,我在这里直接调用Qt自带的类进行网络音频播放和本地播放.比较适用于单词的网上发音和无网情况下的本地发音,而不用将音频文件下载下来,占用太多内存. 为了简便起见,工程里只有一个main.cpp文件,不要忘了在.pro文件中加入下面两行: QT += multimedia CONFIG += qaxcontain

在windows下的QT编程中的_TCHAR与QString之间的转换

由于在windows下的QT编程中,如果涉及到使用微软的API,那么不可避免使用_TCHAR这些类型,因此在网上查了一下,其中一个老外的论坛有人给出了这个转换,因此在这里做一下笔记 : )#ifdef UNICODE #define QStringToTCHAR(x)     (wchar_t*) x.utf16() #define PQStringToTCHAR(x)    (wchar_t*) x->utf16() #define TCHARToQString(x)     QString:

Qt编程18:Qt调色板QPalette的使用

QPalette类有两个枚举类型, 枚举 1.ColorGroup CorGroup指的是3中不同的状态(什么时候设置颜色): 1>Active:获得焦点的状态. 2>Inactive:未获得焦点的状态. 3>Disable:不可用状态. 通常情况下,Active状态与Inactive状态下颜色显示是一致的,当然也可根据需要设置成不一样的颜色 2.ColorRole(设置什么颜色). ColorRole指的是颜色主题,即对窗体中不同部位颜色的分类,如QPalette::Window是指背