qt 编程经验总结

amwip110 贡献于2017-02-23

作者 oempc  创建于2011-01-14 02:35:00   修改者oempc  修改于2011-03-21 07:26:00字数12074

文档摘要:moc命令:用于处理含Q_OBJECT语句(即用到时了信号和槽)的QT类定义头文件(或源文件),以产生出包含QT元对象代码的标准头文件,这样经过处理后的头文件才能在源文件中使用。注意若用qmake工具来构建QT程序,可以设置规则来自动运行moc,无需我们直接运行moc来处理头文件
关键词:

 数据模型更改时,QlistView如何相应的刷新 1 QlistView 控件如何关联数据模型 1 QT中QstringList的清空 2 QT中的pro文件的编写 3 QProgressDialog的使用方法 8 如何添加自定义的slot 函数。 9 Qt标准对话框之QMessageBox 10 Qt 中如何使用外部链接库 14 如何将qte 默认的绿色背景设置为透明 14 布局的时候设置左,上,右,下的距离 15 如何加载图片 15 在Qt4中如何为对话框设置背景? 15 使用qmake工具构建QT应用程序(指定编绎生成 的moc文件目录) moc命令:用于处理含Q_OBJECT语句(即用到时了信号和槽)的QT类定义头文件(或源文件),以产生出包含QT元对象代码的标准头文件,这样经过处理后的头文件才能在源文件中使用。注意若用qmake工具来构建QT程序,可以设置规则来自动运行moc,无需我们直接运行moc来处理头文件     qmake是一个跨平台的程序,使用qmake来构建QT应用程序的步骤:     qmake -project:收集项目信息,比如源文件、头文件、目标二进制文件、库位置等,生成一个跨平台的.pro项目文件(也可自己编写),这个文件用来生成Makefile文件     qmake(-makefile):根据.pro文件生成Makefile文件。接下来就可以运行make工具来编译项目了     .pro文件的格式:     TEMPLATE=app:指定模板变量,表示生成的Makefile类型。app(为默认值)建立应用程序的makefile;lib建立库的makefile;vcapp建立应用程序的Visual Studio项目文件;vclib建立库的Visual Studio项目文件;subdirs创建子目录编译方式的makefile     SUBDIRS=src1:指定子目录     TARGET=filename:指定生成的应用程序名(默认为项目名)     DEPENDPATH+=.:指定程序编译时依赖的相关路径(+=表示追加,=则表示直接指定,下面类同)     INCLUDEPATH+=.:指定头文件包含路径     DESTDIR+=bin:指定应用程序放置的目录     UI_DIR+=form:指定ui界面文件生成的头文件存放目录(ui文件会由uic命令处理并生成ui_*.h头文件)     RCC_DIR+=qrc:指定qrc资源文件生成的头文件存放目录(rcc命令会将.qrc文件转换成qrc_*.h文件)     MOC_DIR+=moc:指定moc生成的头文件存放目录(moc命令将含Q_OBJECT的头文件转换成标准.h文件)     OBJECTS_DIR+=obj:指定目标文件存放的目录     CONFIG+=qt warn_on release:指定编译配置信息,如qt表示用QT库来编译,warn_on把编译器设为输出警告信息,release编译为发布程序,还有debug、debug_and_release等     message($$(PATH)):用于qmake构建时产生消息。$${a}表示读取变量a的字符串,$$(PATH)读取环境变量PATH     win32{ }:添加作用域,把语句放在作用域中,则在其他平台上运行时会忽略     exit():测试一个文件是否存在     error():停止运行qmake,并打印一条错误消息     HEADERS+=hello.h:指定头文件     SOURCES+=filename.cpp:指定源文件     FORMS+=form/filename.ui:指定.ui界面设计文件     RESOURCES+=qrc/painter.qrc:指定.qrc资源文件 数据模型更改时,QlistView如何相应的刷新 int SearchDevicePage::addDeviceIpStrToQListViewWidget(char *ipaddr_string) { printf("addDeviceIpStrToQListViewWidget ipaddr_string(%s)\n", ipaddr_string); return_val_if_failed(ipaddr_string != NULL, RET_INVALID_PARAMETER); deviceIpStringList->append(ipaddr_string); deviceModel->setStringList(*deviceIpStringList); ui.listView_device->setModel(deviceModel); return 0; } QlistView 控件如何关联数据模型 QListView是基于Model,而QListWidget是基于Item。这是它们的本质区别。 往QListView中添加条目需借助QAbstractListModel: 如:     MainWindow::MainWindow(QWidget *parent) :     QMainWindow(parent),     ui(new Ui::MainWindow) {     ui->setupUi(this);     QStringListModel* slm = new QStringListModel(this);     QStringList* sl = new QStringList();     sl->append("asdfsadfsa");     sl->append("asdfsadfsa");     sl->append("asdfsadfsa");     slm->setStringList(*sl);     ui->listView->setModel(slm);     delete sl; } 而在QListWidget中添加条目可以直接additem 如:      QListWidget list;   list.setViewMode(QListWidget::IconMode );   list.setResizeMode(QListWidget::Adjust);   list.setMovement(QListWidget::Static);   for(int i =0; i < 100 ; i ++){   QListWidgetItem *item = new QListWidgetItem(&list);   QStyle::StandardPixmap sp = (QStyle::StandardPixmap)(i % 57);   item->setData(Qt::DecorationRole, qApp->style()->standardPixmap(sp).scaled(QSize(16,16), Qt::KeepAspectRatio, Qt::SmoothTransformation) );   item->setData(Qt::DisplayRole,QObject::tr("Item %1").arg(i));   } QT中QstringList的清空 调用 Clear()函数。 QT中的pro文件的编写 我们在编译QT的工程的时候,一般都会让qmake自动生成,但有时我们需要定制我们的工程,那么就必须改写pro文件。 要自己全部写pro文件又有点麻烦,所以,一般都是先运行       qmake -project 来生成基本的pro文件。   例如你有一个工程目录为backup,那么在这个目录下就会生成backup.pro文件。   对一般的工程,我们只需要修改几个基本的常用的选项,下面说说怎么修改。   假设我们有个目录,名字为backup。下面有a.h,a.cpp,b.h,b.cpp,main.cpp等文件。 首先我们可以在backup目录下运行qmake -project生成backup.pro文件。   888888888888888888888888888888888888888888888888888888888888888888 第一种常用方式: #模块设置,一般设置为app(生成应用程序,默认),subdirs(生成makefile文件编译subdirs指定的子文件夹),lib(生成库文件) TEMPLATE = app #指定生成的应用程序放置的目录 DESTDIR += ../bin #指定生成的应用程序名 TARGET = pksystem #添加或减少CONFIG的配置模块,一般采用默认即可,但是除去debug_and_release模块不会生成debug和release文件夹 #CONFIG += release CONFIG -= debug_and_release #指定uic命令将.ui文件转化成ui_*.h文件的存放的目录 UI_DIR += forms #指定rcc命令将.qrc文件转换成qrc_*.h文件的存放目录 RCC_DIR += ../tmp #指定moc命令将含Q_OBJECT的头文件转换成标准.h文件的存放目录 MOC_DIR += ../tmp #指定目标文件的存放目录 OBJECTS_DIR += ../tmp #程序编译时依赖的相关路径 DEPENDPATH += . forms include qrc sources #头文件包含路径 INCLUDEPATH += . #qmake时产生的信息,$${a}读取变量a的字符串,$$(PATH)读取环境变量PATH #message($$(PATH)) #源文件编码方式 CODECFORSRC = GBK # Input #工程中包含的头文件 HEADERS += include/painter.h #工程中包含的.ui设计文件 FORMS += forms/painter.ui #工程中包含的源文件 SOURCES += sources/main.cpp sources/painter.cpp #工程中包含的资源文件 RESOURCES += qrc/painter.qrc   第二种常用方式,用于子文件夹的编译: #设定模块为子文件夹编译方式 TEMPLATE = subdirs #子文件夹目录,可用\换行 SUBDIRS = src1 \           src2 在backup.pro里已经包含了几个基本的选项,如     TEMPLATE,TARGET,INCLUDEPATH,HEADS,SOURCES等选项。   下面说明一下几个经常修改的选项。     HEADS: 我们工程中头文件如下: HEADS += a.h \                      b.h   SOURCES: 我们工程中的cpp文件,如下: SOURCES += a.cpp \                            b.cpp \                            main.cpp   上面的两个选项的文件分行是用反斜线\来分行,最后一个不用,如果是同一行的文件可以空格分开,我们在执行qmake -project的时候,qmake已经自动帮我们写上了,省去我们这些麻烦,不过以后要增加文件可以在这里增加。       INCLUDEPATH: 这个选项可以指定我们#include语句要包含头文件的目录,如果你有其它的不在当前目录的头文件需要包含进来,并又不想在自己的源文件中使用绝对路径或相对路径来包含头文件,那么我就可以在这里把这个头文件所在的路径包含进来,例如在backup目录的兄弟目录里有个目录为image的目录,里面有个头文件为image.h,我们的b.h里要用到,因此我们在backup.pro文件中设置INCLUDEPATH为      INCLUDEPATH += ../image 这样,我们在b.h里只需要#include "image.h"就可以了。       CONFIG: CONFIG经常用到的一个是就是设置release版本或是debug或是release和debug的版本信息。如果我们要调试可以这样设置。     CONFIG += debug     或CONFIG += release (release版本)     下面是CONFIG的几个版本的选项: release The project is to be built in release mode. This is ignored if debug   is also specified.  debug The project is to be built in debug mode.  debug_and_release The project is built in both   debug and release modes. This can have some unexpected side effects (see below for more information).  build_all If debug_and_release   is specified, the project is built in both debug and release modes by default.  ordered When using the subdirs   template, this option specifies that the directories listed should be processed in the order in which they are given.  precompile_header Enables support for the use of precompiled headers   in projects.  warn_on The compiler should output as many warnings as possible. This is ignored if warn_off   is specified.  warn_off The compiler should output as few warnings as possible.     LIBS: 这里可以选择我们要包含的库,例如我们的工程要用到libz.so的一个压缩库,我可以怎么写:     LIBS += -lz 或是用到我们image目录下的libimage.so库,那么可以这么写:     LIBS += -L../image/image       DEFINES: DEFINES又是我们一个常用的定要,它相当于我们用gcc的-D定义。例如,我们的backup工程需要对大文件进行读写就可以这样定义: DEFINES += _LARGEFILE64_SOURCE   _FILE_OFFSET_BITS=64       RESOURCES: 定义我们的资源描述文件,我们工程里需要很多图片,那么这些图片的定义都可以放在backup.qrc文件中进行描述,那么这里就可以指出我们的qrc文件。 RESOURCES += backup.qrc       TARGET: 这个选项可以让我们定义我们生成的目标文件的名字,例如我们执行我们这个backup工程是默认生成backup的执行文件,但我们想让我们的执行的文件名为abcbackup,我们就可以这样写 TARGET = abcbackup         OBJECTS_DIR:           一般我们在编译我们的工程的时候会生成许多的中间文件,如.o文件(linux下)或.obj(windows下),这样我们的工程就很乱,所以我们可以定义这个选择,我们可以这样定义: OBJECTS_DIR += ./objs 这样,我们的这些中间文件就全都在backup/objs目录下了         一般,我们不会在我们的工程里直接编译,这样的话,工程比较乱,我们可以在backup目录下建立一个目录,为bakcup-build目录,我们在这个目录下编译,这样其他的临时文件就在这个目录下,这样我们的工程看起来就不会那么乱了。       我们进入bakcup-build目录,然后运行              qmake -o Makefile ../bakcup.pro       这样我们就在当前目录下生成了一个Makefile。在这个目录下执行make就可以生成我们的abcbackup可执行程序了 QProgressDialog的使用方法 而用QProcessDialog也是类似的,只不过这是以对话框形式显示;并且它还提供了一个取消按钮,用来取消操作。 QProcessDialog会自动那个计算百分比,并显示。 void MainWindow::on_pushButton_clicked() { QProgressDialog process(this); process.setLabelText(tr("processing...")); process.setRange(0,50000); process.setModal(true); process.setCancelButtonText(tr("cancel")); for(int i=0;i<50000;i++) { for(int j=0;j<20000;j++); process.setValue(i); if(process.wasCanceled()) break; } } 如何添加自定义的slot 函数。 以添加recordOnRadioButtonClickedHandle函数为例。 1 头文件里定义recordOnRadioButtonClickedHandle函数,并在.cpp 文件里实现函数主体内容。 setuppage.h public slots: void recordOnRadioButtonClickedHandle(); setuppage.cpp void SetupPage::recordOnRadioButtonClickedHandle() { printf("recordOnRadioButtonClickedHandle handle!\n"); return; } 2 与信号连接。 connect(recordOnRadioButton,SIGNAL(clicked()),this,SLOT(recordOnRadioButtonClickedHandle())); 3 对文件里添加 Q_OBJECT 4 重新生成makefile Qt标准对话框之QMessageBox   这次来说一下QMessageBox以及类似的几种对话框。其实,我们已经用过QMessageBox了, 就在之前的几个程序中。不过,当时是大略的说了一下,现在专门来说说这几种对话框。   好久没有更新博客,主 要是公司里面还在验收一些东西,所以没有及时更新。而且也在写一个基于Qt的画图程序,基本上类似于PS的东西,主要用到的是Qt Graphics View Framework。好了,现在还是继续来说说Qt的标准对话框吧!   这次来说一下QMessageBox以及类似的几种对话框。其实,我们已经用过QMessageBox了,就在之前的几个程序中。不过,当时是 大略的说了一下,现在专门来说说这几种对话框。   先来看一下最熟悉的QMessageBox::information。我们在以前的代码中这样使用过: QMessageBox::information(NULL, "Title", "Content", QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);   下面是一个简单的例子:      现在我们从API中看看它的函数签名:   static StandardButton QMessageBox::information ( QWidget * parent, const QString & title, const QString & text, StandardButtons buttons = Ok, StandardButton defaultButton = NoButton );   首先,它是static的,所以我们能够使用类名直接访问到(怎么看都像废话…);然后看它那一堆参数,第一个参数parent,说明它的父组 件;第二个参数title,也就是对话框的标题;第三个参数text,是对话框显示的内容;第四个参数buttons,声明对话框放置的按钮,默认是只放 置一个OK按钮,这个参数可以使用或运算,例如我们希望有一个Yes和一个No的按钮,可以使用QMessageBox::Yes | QMessageBox::No,所有的按钮类型可以在QMessageBox声明的StandarButton枚举中找到;第五个参数 defaultButton就是默认选中的按钮,默认值是NoButton,也就是哪个按钮都不选中。这么多参数,豆子也是记不住的啊!所以,我们在用 QtCreator写的时候,可以在输入QMessageBox::information之后输入(,稍等一下,QtCreator就会帮我们把函数签 名显示在右上方了,还是挺方便的一个功能!   Qt提供了五个类似的接口,用于显示类似的窗口。具体代码这里就不做介绍,只是来看一下样子吧!   QMessageBox::critical(NULL, "critical", "Content", QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);      QMessageBox::warning(NULL, "warning", "Content", QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);      QMessageBox::question(NULL, "question", "Content", QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);      QMessageBox::about(NULL, "About", "About this application");      请注意,最后一个about()函数是没有后两个关于button设置的按钮的!   QMessageBox对话框的文本信息时可以支持HTML标签的。例如:   QMessageBox::about(NULL, "About", "About this application");   运行效果如下:      如果我们想自定义图片的话,也是很简单的。这时候就不能使用这几个static的函数了,而是要我们自己定义一个QMessagebox来使 用:    QMessageBox message(QMessageBox::NoIcon, "Title", "Content with icon.");    message.setIconPixmap(QPixmap("icon.png"));   message.show();   需要注意的是,同其他的程序类似,我们在程序中定义的相对路径都是要相对于运行时的.exe文件的地址的。比如我们写"icon.png",意 思是是在.exe的当前目录下寻找一个"icon.png"的文件。这个程序的运行效果如下:      还有一点要注意,我们使用的是png格式的图片。因为Qt内置的处理图片格式是png,所以这不会引起很大的麻烦,如果你要使用jpeg格式的 图片的话,Qt是以插件的形式支持的。在开发时没有什么问题,不过如果要部署的话,需要注意这一点。   最后再来说一下怎么处理对话框的交互。我们使用QMessageBox类的时候有两种方式,一是使用static函数,另外是使用构造函数。   首先来说一下static函数的方式。注意,static函数都是要返回一个StandardButton,我们就可以通过判断这个返回值来对 用户的操作做出相应。 QMessageBox::StandardButton rb = QMessageBox::question(NULL, "Show Qt", "Do you want to show Qt dialog?", QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);   if(rb == QMessageBox::Yes)   {     QMessageBox::aboutQt(NULL, "About Qt");   }   如果要使用构造函数的方式,那么我们就要自己运行判断一下啦:   QMessageBox message(QMessageBox::NoIcon, "Show Qt", "Do you want to show Qt dialog?", QMessageBox::Yes | QMessageBox::No, NULL);   if(message.exec() == QMessageBox::Yes)   {     QMessageBox::aboutQt(NULL, "About Qt");   }   其实道理上也是差不多的。 Qt 中如何使用外部链接库 在.pro 文件使用情况如下所示。 LIBS=./cores/libcores.a 如何将qte 默认的绿色背景设置为透明 Qte 启动时会将背色设置为绿色背色, 这个颜色实在是太恶心了, 现需要OSD层与视频层叠加显示,需要设置背色绿色为透明。我的实现方法如下 1 设置framerbuffer,定义TRANSPARENT_COLOR颜色不显示。 stColorKey.bKeyEnable = HI_TRUE; stColorKey.u32Key = TRANSPARENT_COLOR; stColorKey.bMaskEnable = HI_FALSE; stColorKey.u8BlueMask = 255; stColorKey.u8RedMask = 255; stColorKey.u8GreenMask = 255; if (ioctl(m_Fb.FrameBufferFd, FBIOPUT_COLORKEY_HIFB, &stColorKey) < 0) { return -OEC_HARDWAREERROR; } 注:TRANSPARENT_COLOR 颜色的RGB值分别为255,0,0 2 设置QT的背景色为TRANSPARENT_COLOR QBrush *BackColor = new QBrush(QColor(255,0,0)); //设置背景颜色 QWSServer::setBackground(*BackColor); //应用背景颜色 布局的时候设置左,上,右,下的距离 我用红字圈不来的那哥们的回答确实很有用。还有vlolv那哥们的回答很准确的解释了我的疑问。也是,你既然要设定坐标为什么还让QT去layout,明摆了没事找事么。 jwvwv的两个方法我只试了setContentsMargins,发现其实很管用,查看文档, void QWidget::setContentsMargins ( int left, int top, int right, int bottom ) Sets the margins around the contents of the widget to have the sizes left, top, right, and bottom. The margins are used by the layout system, and may be used by subclasses to specify the area to draw in (e.g. excluding the frame). Changing the margins will trigger a resizeEvent(). 噢,原来就是布局的时候设置实际的距离左,上,右,下的距离,这样其实就基本实现了我的要求。我设置坐标其实不是死的,只是想让他距离上边框有一定的距离。 如何加载图片 有两种方法,一种是加载直接路径 1 加载图片的直接路径,例如图片在当前文件夹下的image目录下。 image.load("./images/mainwindow_background.png"); 2 加载图片的相对路径 image.load(":./images/mainwindow_background.png"); 当以此种形式加载图片时,图片的路径也是要在qrc文件里进行定义的。 images/mainwindow_background.png 这样意义统一更改图片的路径, 当切换主题的时候只用切换qrc文件便可。 在Qt4中如何为对话框设置背景? 答:这个问题值得总结一下。大致有以下的思路和方法: 1.重写paintEvent()事件 在该事件中用画笔QPainter重画整个背景。该方法比较复杂,不建议初学者采用。 2.使用调色板类QPalette   //以下代码中pWidget为指向要设置的widget的指针。    QPalette palette = pWidget->palette();    palette->setBrush(QPalette::Active,QPalette::Window,QBrush(Qt::red));    pWidget->setPalette(palette);   pWidget->setAutoBackground(true);    推荐使用这种方法,大家可以查看一下setBrush()方法的定义:   Palette::setBrush ( ColorGroup group, ColorRole role, const QBrush & brush )    这个是一个重载版本,最为重要的是第二个参数,可以设置许多不同的类型。举例来说, 如果pWidget指向的是一个QListWidget或者QTextEdit对象,如果把第二个参数设置成QPalette::Text,则是设置其中文字的颜色;如果第二个参数是QPalette::BrightText,则是设置该对象被选中时,其文字的颜色;如果第二个参数QPalette::Bright则表示设置选中该对象时,高亮背景的颜色或者图片。该函数的功能是很强大的。 3.使用样式表。   pWidget->setStyleSheet("background-color:blue;"); //设置背景颜色    pWidget->setStyleSheet("background-image:url(:/folder/show.bmp);"); //设置背景图片此外,还有一些很有意思的方法,比如用setHtml(),insetHtml()这种用HTML语言的方式来指定的等等,大家可以多查查帮助文档搜索一下。 4.具体例子   //设置为固定颜色 QPalette pal = pWidget->palette();    pal.setColor(QPalette::Background, QColor(0,0,0)); //黑色    pWidget->setPalette( pal ); //背景图片    QPalette pal = pWidget->palette();    pal.setBrush( QPixmap(图片文件名) ); //黑色    pWidget->setPalette( pal );

下载文档到电脑,查找使用更方便

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 10 金币 [ 分享文档获得金币 ] 0 人已下载

下载文档