qtcreatorforlinux
A. 如何在linux中用QTcreator 调用本地摄像头
/* 打开设备并进行错误检查 */
int fd = open ("/dev/video",O_RDONLY);
if (fd==-1){
perror ("Can't open device");
return -1;
}
/* 查询设备的输出格式 */
struct v4l2_format format;
memset (&format,0,sizoef(format));
format.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
if (-1==ioctl(fd,VIDIOC_G_FMT,&format)){
perror ("While getting format");
return -2;
}
/*
* 这里要将struct v4l2_format结构体置零,然后将
* format.type设定为V4L2_BUF_TYPE_VIDEO_CAPTURE,
* 这样在进行 VIDIOC_G_FMT 的ioctl时,驱动就会知
* 道是在捕获视频的情形下获取格式的内容。
* 成功返回后,format就含有捕获视频的尺寸大小及格
* 式。格式存储在 format.fmt.pix.pixelformat这个32
* 位的无符号整数中,共四个字节,以小头序存储。这里
* 介绍一种获取的方法。
*/
char code[5];
unsigned int i;
for (i=0;i<4;i++) {
code[i] = (format.fmt.pix.pixelformat & (0xff<<i*8))>>i*8;
}
code[4]=0;
/* 现在的code是一个以\0结束的字符串。很多摄像头都是以格式MJPG输出视频的。
* MJPG是Motion JPEG的缩写,其实就是一些没填霍夫曼表的JPEG图片。
*/
/* 请求一定数量的缓冲区。
* 但是不一定能请求到那么多。据体还得看返回的数量
*/
struct v4l2_requestbuffers req;
memset (&req,0,sizeof(req));
req.count = 10;
req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
req.memory = V4L2_MEMORY_MMAP;
if (-1==ioctl(fd,VIDIOC_REQBUFS,&req)){
perror ("While requesting buffers");
return -3;
}
if (req.count < 5){
fprintf (stderr, "Can't get enough buffers!\n");
return -4;
}
/* 这里请求了10块缓存区,并将其类型设为MMAP型。 */
/* 获取缓冲区的信息
* 在操作之前,我们必须要能记录下我们
* 申请的缓存区,并在最后使用munmap释放它们
* 这里使用结构体
* struct buffer {
* void * start;
* ssize_t length;
* } 以及buffer数量
* static int nbuffer
* 来表示
*/
struct buffer * buffers = (struct buffer *)malloc (nbuffer*sizeof(*buffers));
if (!buffers){
perror ("Can't allocate memory for buffers!");
return -4;
}
struct v4l2_buffer buf;
for (nbuffer=0;nbuffer<req.count;++nbuffer) {
memset (&buf,0,sizeof(buf));
buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
buf.memory = V4L2_MEMORY_MMAP;
buf.index = nbuffer;
if (-1==ioctl(fd,VIDIOC_QUERYBUF,&buf)){
perror ("While querying buffer");
return -5;
}
buffers[nbuffer].length = buf.length;
buffers[nbuffer].start = mmap (
NULL,
buf.length,
PROT_READ, /* 官方文档说要加上PROT_WRITE,但加上会出错 */
MAP_SHARED,
fd,
buf.m.offset
);
if (MAP_FAILED == buffers[nbuffer].start) {
perror ("While mapping memory");
return -6;
}
}
/*这个循环完成后,所有缓存区都保存在
*了buffers这个数组里了,完了就再将它们munmap即可。
*/
/* 打开视频捕获 */
enum v4l2_buf_type type;
type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
if (-1==ioctl(fd,VIDIOC_STREAMON,&type)){
perror ("While opening stream");
return -7;
}
/* 与内核交换缓冲区 */
unsigned int i;
i=0;
while(1) {
memset (&buf,0,sizeof(buf));
buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
buf.memory = V4L2_MEMORY_MMAP;
buf.index = i;
if (-1==ioctl(fd,VIDIOC_DQBUF,&buf)){
perror ("While getting buffer's data");
return -8;
}
/* 现在就得到了一片缓冲区的数据,发送处理 */
process_image ( buffers+buf.index,buf.index );
/* 将缓冲区交还给内核 */
if (-1==ioctl(fd,VIDIOC_QBUF,&buf)){
perror ("While returning buffer's data");
return -9;
}
i = (i+1) & nbuffer;
}
这就是所有获取的过程了。至于图像的处理,则是由解码函数和Qt来处理。现在先进行一些思路的设计。设想在进行图像的转换时,必须提供一块内存区域来进行,我们当然可以在转换时使用malloc来进行动态分配,转换完成并显示后,再将它free。然而这样做对内核而言是一个不小的负担:每次为一整张图片分配内存,最少也有上百KB,如此大的分配量和释放量,很容易造成内存碎片加重内核的负担。由于仅是每转换一次才显示一次图像,所以这片用于转换的内存区域可以安全地复用,不会同时由两个线程操作之。因此在初始化时我们为每一块内存映射缓冲区分配一块内存区域作为转换用。对于MJPEG到JPEG的转换,使用相同的内存大小。代码就不在此列出了。这片假设这个内存区域的起始指针为convertion_buffers,在process_image (struct buffer * buf, int index ) 中,有
void process_image (struct buffer *buf, int index){
struct * buffer conv_buf = convertion_buffers+index;
do_image_conversion (
buf->start, buf->length, /* 要转换的区域 */
conv_buf->start, conv_buf->length, /* 保存转换数据的区域 */
);
/* 现在就可以把数据取出并交给QPixmap处理
* 要在一个QWidget里作图,必须重载paintEvent
* 函数并用QPainter作画。然而paintEvent
* 是由事件驱动层调用的,我们不能手工,
* 所以在我们自己的的重载类里要保存一个全局
* 的QPixmap。这里设为 QPixmap * m_pixmap
*/
m_pixmap -> loadFromData (conv_buf->start,conv_buf->length);
/* 立即安排一次重绘事件 */
repaint ();
}
/* 重载的paintEvent示例 */
MyWidget::paintEvent (QPaintEvent * evt) {
QPainter painter(this);
painter.drawPixmap (QPoint(0,0),*m_pixmap);
QWidget::paintEvent(evt);
}
V4L搞定 +QT显示摄像头视频 +QT显示GIF动画 2009-11-02 09:32 哎 两星期前终于搞定了qt上显示摄像头视频采集 现在来把最终重要的代码总结下 QImage img; unsigned char *bit= v4l _dev.buffer; / /v41_dev.buffer为内存映射的地址 QRgb *point; int r, g, b; QPainter paint; if(img.create(MAX_WIDTH, MAX_HEIGHT,32, 0, QImage::IgnoreEndian)) { for(y=0; ysetMovie(movie); gif_lable->show();
哎 两星期前终于搞定了qt上显示摄像头视频采集, 现在来把最终重要的代码总结下
QImage img;
unsigned char *bit= v4l _dev.buffer; / //v41_dev.buffer为内存映射的地址
QRgb *point;
int r, g, b;
QPainter paint;
if(img.create(MAX_WIDTH, MAX_HEIGHT,32, 0, QImage::IgnoreEndian))
{
for(y=0; y<MAX_HEIGHT; y++)
{
for(x=0; x<MAX_WIDTH; x++)
{
r=(int)bit[i+2];
g=(int)bit[i+1];
b=(int)bit[i];
point= (QRgb *)(img).scanLine(y)+ x;
*point = qRgb(r,g,b); //qRgb函数能够将数据转为RGB三像素值
i+=3;
}
}
}
但是不是很明白,希望有人能把这个直接写成 QT GUI APPLICATION PROJECT 然后我再参考下。。。因为对于QT的类库真的不太了解,呵呵
B. 如何安装qt for linux
一、下载
1
首先,前往如图所示的官网地址下载需要的Qt组件。
2
在下载页面中,单击如图所示的Download下载按钮。该版本是可供大家免费使用的。
3
接下来,在打开的页面中,注意不单击那个显着的Download Now下载按钮,这其实是下载一个安装器到本地电脑,用安装器下载Qt的速度很慢。
我们单击下面的 View All Downloads 文字链接,打开真实的Qt下载地址直接下载。
4
页面打开后,就可以单击链接直接下载所需的Qt组件了。
在 windows 下常见的安装方式需要下载的组件如下:
1)32 位 Windows,使用 MinGW:下载 Qt 5.4.0 for Windows 32-bit (MinGW 4.9.1) 【注:系统上无须已安装 MinGW】
2)32 位/64位 Windows,使用 VS2013:下载对应版本的 VS2013 Qt 5.4.0 for Windows 32/64-bit 【注:系统上需要已经安装 VS2013】
3)32 位/64位 Windows,使用 OpenGL:下载对应版本的 Qt 5.4.0 for Windows 32/64-bit VS 2010/2012/2013, OpenGL【注:系统上需要已经安装 VS2010/2012/2013】
5
在这儿需要提醒大家注意:
1)要根据自己的电脑系统来选择组件。比如以上下载链接请先认准是在 windows 主机一栏下的链接。如果是 Linux 系统,则应到 Linux 主机一栏下去找下载链接
2)无需另外下载 Qt Creator 集成开发环境,以上每组组件均已包含
END
二、安装
组件下载后,双击即可启动安装。
首先是选择安装目录。
然后是选择要安装的项目,一般全部勾选。
选择同意条款。
点击下一步。
到了如下界面时,一切安装前准备工作就已经做好了,点击“安装”按钮静心等待安装完成就可以了。
C. linux安装qt creator出错
文件有问题,或者是版本冲突。你把qtsdk-2010.05卸载,试试。
D. linux下 用qt creator 编译程序 提示错误,请高手指导
缺少g++ 安装C编译器 如果你是UBUNTU 你就用 #sudo apt-get install g++
E. qtcreator在Linux上调用失败,求助
不管是windows还是在Linux,出现这个问题首先考虑查看系统下是否安装有调试器
1.如果没有安装,则安装合适的调试器,然后转步骤3;
2.如果已安装调试器则查看QtCreator能否自动检测到。如果未检测到转步骤3.
3.设置调试器:在工具->选项->构建和运行->调试器中添加调试器。重启QtCreator即可。
ps: linux下使用 yum install gdb,安装gdb调试工具。
F. 如何使用qtcreator linux
安装
后得到大小 47.2 Mb 的安装文件 qt-creator-linux-x86_64-opensource-1.3.0.bin,在 Linux 上安装如下:
chmod u+x ./qt-creator-linux-x86_64-opensource-1.3.0.bin
./qt-creator-linux-x86_64-opensource-1.3.0.bin
这时候,启动了 Setup Qt Creator 欢迎安装对话框,点击“Next”->
协议许可界面,选择“I accept the agreement”,点击“Next” ->
选择 Qt Creator 安装目录对话框。作者选择的是 /home/defonds/TOOLS/qtcreator/qtcreator-1.3.0,点击“Next” ->
准备安装界面,点击“Next” ->
安装结束,点击“Finish”。
Qt Creator 使用
新建项目 HelloWorld
启动桌面上的 Qt Creator。新建工程 HelloWorld,菜单点击“File” -> New File or Project -> Projects 中选择 Empty Qt4 Project -> OK -> 项目名键入 HelloWorld,工作台随意,作者选择的是 /home/defonds/cpp/qt , Next -> Finish。
G. linux下的qt creator需要安装什么组件
QT的早期版本和现在版本有点变化,提供的文件也不尽相同,最新的版本为5.0,我这里用的是4.8.4,一个完整的QT应该包括QT库、IDE也就是QT creator,在Linux下的安装中,目前看到的主要有三种方法:
1bin文件直接安装,文件名为qt-sdk-……,一个./bin直接包括了所有相关工具,安装起来最为简单方便,但是目前的4.8.4在几个网站上已经找不到总的sdk的bin文件了,老版本的还是可以的。
H. 如何在ubuntu下安装qt-creator-linux-x86
Qt Creator支持中文,启动速度比Eclipse、Netbeans更快,界面也更美观,跟输入法Fcitx协作良好(光标跟随)。 你既可以把Qt Creator当代码编辑器作为vim辅助,好处在于Qt Creator能够自动parse项目,形成友好快速的智能提示,而且你也同样可以使用Qt Creator里面的gdb前端(上图)和valgrind前端(高清大图) 对项目进行调试和内存分析,不过Makefile就要自己写或者用autotools生成了,这对于使用vim进行编程的同学来说,应该是轻车熟路的。差点忘了,连续按两次Alt+V快捷键即可进入VIM编辑模式(FakeVim),这应该很能吸引vim用户。当然,Qt Creator默认支持主流版本控制系统git/hg/svn等。 你也可以把Qt Creator当作IDE,这时可以作为Eclipse CDT、 Netbeans for C++这些重量级IDE的一个轻量替代品。你可以直接在Qt Creator的向导里新建一个非Qt使用CMake自动构建的项目,这意味着你不用自己写Makefile,你只要在Qt Creator里“执行CMake”就能自动生成。当然,你也可以导入一个make构建的项目到Qt Creator里编译调试,比如Nginx。 1、安装Qt Creator和基础构建环境(以Ubuntu为例): 安装基础系统构建工具包: 代码如下: sudo apt-get -y install build-essential cmake valgrind 下载最新版二进制Qt Creator(建议使用基于Qt4构建的2/qtproject/official_releases/qtcreator/2.8/2.8.1/ 不进行GUI编程,不需要安装Qt SDK,也就没有qmake和相关Qt开发库,只用下载那个60M的Qt Creator就好了,比如我下的是: 代码如下: qt-creator-linux-x86_64-opensource-2.8.1.run 下载后给予执行权限,运行选择安装目录安装即可,可以安装在自己的家目录。 项目配置默认存放位置~/.config/QtProject 可以通过参数-settingspath自定义配置文件存放位置,比如: 代码如下: /home/eechen/qtcreator-2.8.1/bin/qtcreator -settingspath /home/eechen/qtcreator-2.8.1 注意:如果你用的是基于Qt5构建的Qt Creator 3系列,其默认集成了iBus输入法插件,而对于Fcitx插件,则需要手动安装包fcitx-frontend-qt5, 然后复制.so到Qt Creator 3的 bin/plugins/platforminputcontexts 目录,比如: sudo apt-get install fcitx-frontend-qt5 ln -s /usr/lib/`arch`-linux-gnu/qt5/plugins/platforminputcontexts/.so /png/dev/qtcreator-3.2.1/bin/plugins/platforminputcontexts/ 重启QtCreator,就可以正常使用Fcitx输入法了. 2、把自动完成快捷键"Ctrl+空格"改为"Alt+/"或者"Shift+Return"(Return表示Enter键) 工具-选项-环境-键盘: 键盘快捷键输入"Ctrl+空格",在键位顺序中点击x删除原来的"Ctrl+空格",输入新的"Alt+/",确定退出. 3、在Qt Creator中使用make构建,运行,调试通用C/C++项目 文件-新建文件或项目-导入项目-导入现有项目 这样导入的项目用的是make构建,需要自己写好Makefile文件后才能构建,支持自动完成,支持调试和内存分析. 4、在Qt Creator中使用cmake构建,运行,调试通用C/C++项目 文件-新建文件或项目-非Qt项目:新建一个CMake项目 在"执行CMake"这一步的参数中填入-DCMAKE_BUILD_TYPE=Debug 这样才可以在Qt Creator中调试程序,-DCMAKE_BUILD_TYPE的值可以设为Debug或者Release或者RelWithDebInfo. cmake可以自动生成Makefile方便用make构建项目,但使用cmake构建项目也必须要会编写CMakeLists.txt文件. Qt Creator支持使用qmake,make,cmake构建项目,但不能直接往cmake项目里添加文件,Qt Creator对CMake的支持还有待改进. 临时的做法是,切换到文件管理器来添加文件,然后右击项目"执行CMake"使parsing(语法解析)生效,并载入文件到在项目. 5、Qt Creator会自动识别系统中安装的gcc、g++、gdb、make、cmake、valgrind,也可以自己到菜单"工具"->"选项"里进行一些自定义配置. 配置vim外部编辑器: 工具->选项->环境->外部工具->使用vi进行编辑 把xterm改为konsole或者gnome-terminal 参数改为-e vim "%{CurrentDocument:FilePath}" 配置终端: 工具->选项->环境->概要 KDE环境默认为 代码如下: /usr/bin/konsole -e 如果要用gnome-terminal,则设为/usr/bin/gnome-terminal -x 设置在终端运行程序: 项目(侧边栏)-运行-勾选"在终端中运行" 调试(gdb)时出现"ptrace operation not permitted"问题解决办法: 临时设置: 代码如下: sudo sysctl kernel.yama.ptrace_scope=0 永久设置: 编辑/etc/sysctl.d/10-ptrace.conf改为kernel.yama.ptrace_scope = 0 系统默认设为1的目的是为了安全,防止用户程序(比如这里的gdb)访问其他进程(比如这里的konsole,gnome-terminal)内存的数据.
I. linux 怎样安装 qtcreator开发的程序
安装
下载后得到大小 47.2 Mb 的安装文件 qt-creator-linux-x86_64-opensource-1.3.0.bin,在 Linux 上安装如下:
chmod u+x ./qt-creator-linux-x86_64-opensource-1.3.0.bin
./qt-creator-linux-x86_64-opensource-1.3.0.bin
这时候,启动了 Setup Qt Creator 欢迎安装对话框,点击“Next”->
协议许可界面,选择“I accept the agreement”,点击“Next” ->
选择 Qt Creator 安装目录对话框。作者选择的是 /home/defonds/TOOLS/qtcreator/qtcreator-1.3.0,点击“Next” ->
准备安装界面,点击“Next” ->
安装结束,点击“Finish”。
Qt Creator 使用
新建项目 HelloWorld
启动桌面上的 Qt Creator。新建工程 HelloWorld,菜单点击“File” -> New File or Project... -> Projects 中选择 Empty Qt4 Project -> OK -> 项目名键入 HelloWorld,工作台随意,作者选择的是 /home/defonds/cpp/qt , Next -> Finish。
J. windows下qt creator编写的程序如何在linux下执行
Windows下是ANCII编码的,Linux下是Unicode编码的,源程序注意转化一下编码就可以了。
fedora12下面,你可以去Qt的官方网站下载rpm安装包或者在在线软件仓库里找找啊。
Qt Creator在Windows下和在Linux下的用法基本一样,就是注意以下源文件的字符编码就OK了。还有Linux下的文件名连后缀都是区分大小写的,所以一些涉及到文件读写的程序,后缀名也要注意一下。