Hello,Qt——Linux下编写Qt程序的详细步骤

简介:

前一段时间做过一个在Linux下编写的Qt程序,没来得及总结,现在总结一下Linux下开发的详细步骤。不过现在发现使用Eclipse或者Qt Creator要比直接用VIM编程快捷多了,以后在学习Qt的过程中可能就不直接在Linux下编了,先在Winxp下编了再移植吧。

任务:在Redhat系统下创建和显示一个简单的窗口,使用标签显示字符串“Hello, Qt!”,在Redhat上调试通过后交叉编译下载至MagicARM2410上运行。 

主要思想:标签是设计图形界面不可或缺的基本组件,利用标签我们可以显示各种信息。Qt为标签提供了一系列API函数,通过调用这些函数,可以很容易设计各种标签。调用Qt中标签的API函数,必须包含标签的头文件qlabel.h。如果需要显示的字符串信息很长,建议不要使用QLabel,改用其它部件如MultiLineedit(多行编辑区)。 

详细步骤

(1)进入/zylinux/x86-qtopia目录(Qt x86安装目录),运行set-env脚本,为本实验设置环境变量,然后创建文件夹hello。

   1: $ cd /zylinux/x86-qtopia
   2:  
   3: $ . set-env
   4:  
   5: $ mkdir hello

(2)进入hello目录,新建文件hello.cpp,并编写程序,然后用progen工具生成工程文件hello.pro。

   1: $ cd hello
   2:  
   3: $ vi hello.cpp
   4:  
   5: $ progen –t app.t –o hello.pro

(3)使用tmake工具,生成hello工程的Makefile文件。

$ tmake -o Makefile hello.pro

(4)修改Makefile文件,在LIBS变量中增加需要用到的库,然后输入make命令编译。

   1: LIBS    =       $(SUBLIBS) -L$(QTDIR)/lib -lqte -lm -lstdc++

               $ make

(5)启动虚拟控制台,运行hello程序(主机须启动帧缓冲,必须能够访问/dev/fb0)。

   1: $ cd /zylinux/x86-qtopia
   2:  qvfb&
   3: $ cd hello
   4:  
   5: $ ./hello –qws

        或者在终端,启动虚拟缓冲区和QPE,启动Qtopia的终端,输入./hello运行程序,亦可得到和图 6.1一样的结果。

$ cd /zylinux/x86-qtopia

$ . set-env

$ cd hello

$ qvfb&

$ ./hello

$ qpe

 如果要将Hello程序发布到MagicARM2410上运行,还需进行以下工作:

(6)进入/zylinux/arm-qtopia目录(安装目录),并将hello工程复制到当前目录下。

$ cd /zylinux/arm-qtopia

$ cp –av /zylinux/x86-qtopia/hello .

(7)运行当前目录下的set-env文件,重新设置环境变量,进入hello目录,使用tmake工具,重新生成Makefile文件。

$ . set-env

$ cd hello

$ tmake -o Makefile hello.pro

(8)按照步骤(4)的方法修改包含库,编译,得到可执行文件hello,将hello文件添加到文件系统中,更新文件系统。

(9)插入USB鼠标和USB键盘,启动MagicARM2410。启动Qtopia的终端,运行hello程序。

注意事项:

      (1)如果在PC中运行hello程序,出现某些库找不到,该如何处理?

         提示:将所缺的库从/zylinux/x86-qtopia/qt/lib目录下复制到主机系统/usr/lib目录下即可。

        (2)在ARM上运行时如果也出现类似问题,又该如何解决?

        提示:将所缺的库从/zylinux/arm-qtopia/qt/lib目录下复制到目标系统/usr/lib目录下即可。

      (3)使用自定义插槽:

        Q_OBJECT

        ....

        private slots:

            void popupDialog();

       tmake可以自动处理moc,如果出现undefined vtable,则用moc生成moc_hello.cpp,编译成moc_hello.o,最后一起连接即可。

参考程序:

   1: hello.h
   2:  
   3: #ifndef _HELLO_H_
   4:  
   5: #define _HELLO_H_
   6:  
   7: #include <qapplication.h>
   8:  
   9: #include <qlabel.h>
  10:  
  11: #include <qpushbutton.h>
  12:  
  13: #include <qfont.h>
  14:  
  15: #include <qwidget.h>
  16:  
  17: #include <qlayout.h>
  18:  
  19: #include <qdialog.h>
  20:  
  21: class HelloWidget:public QWidget {
  22:  
  23:       Q_OBJECT
  24:  
  25:       public:
  26:  
  27:         HelloWidget(QWidget * parent = 0, const char *name = 0);
  28:  
  29:       private:
  30:  
  31:          QPushButton * quit;
  32:  
  33:          QPushButton *hello;
  34:  
  35:       private slots:
  36:  
  37:           void popupDialog();
  38:  
  39: };
  40:  
  41: #endif
  42:  
  43: hello.cpp
  44:  
  45: #include "hello.h"
  46:  
  47: void HelloWidget::popupDialog()
  48:  
  49: {
  50:  
  51: QDialog *dlg = new QDialog(0, "popup", FALSE);
  52:  
  53: dlg->setCaption("Dialog");
  54:  
  55: QPushButton *btn = new QPushButton("PopDown", dlg);
  56:  
  57: btn->setGeometry(50, 20, 100, 40);
  58:  
  59: connect(btn, SIGNAL(clicked()), dlg, SLOT(accept()));
  60:  
  61: dlg->show();
  62:  
  63: }
  64:  
  65: HelloWidget::HelloWidget(QWidget * parent,
  66:  
  67: const char *name):QWidget(parent, name)
  68:  
  69: {
  70:  
  71: QBoxLayout *demo = new QVBoxLayout(this);
  72:  
  73: QLabel *label = new QLabel(this);
  74:  
  75: hello = new QPushButton(this);
  76:  
  77: quit = new QPushButton("Exit", this);
  78:  
  79: quit->resize(100, 100);
  80:  
  81: label->setText("This is a label");
  82:  
  83: label->resize(150, 30);
  84:  
  85: hello->setText("Hello ,Button");
  86:  
  87: hello->resize(250, 30);
  88:  
  89: hello->setFont(QFont("Helvetica", 18, QFont::Bold));
  90:  
  91: connect(hello, SIGNAL(clicked()), this, SLOT(popupDialog()));
  92:  
  93: connect(quit, SIGNAL(clicked()), qApp, SLOT(quit()));
  94:  
  95: demo->addWidget(hello);
  96:  
  97: demo->addWidget(label);
  98:  
  99: demo->addWidget(quit);
 100:  
 101: demo->activate();
 102:  
 103: }
 104:  
 105: int main(int argc, char **argv)
 106:  
 107: {
 108:  
 109: QApplication app(argc, argv);
 110:  
 111: HelloWidget hello;
 112:  
 113: app.setMainWidget(&hello);
 114:  
 115: hello.show();
 116:  
 117: int result = app.exec();
 118:  
 119: return result;
 120:  
 121: }
 122:  

Makefie:

#############################################################################

# Makefile for building hello

# Generated by tmake at 10:50, 2006/02/21

#     Project: hello

#    Template: app

#############################################################################

####### Compiler, tools and options

CC = gcc

CXX = g++

CFLAGS = -pipe -Wall -W -O2 -DNO_DEBUG

CXXFLAGS= -pipe -DQWS -fno-exceptions -fno-rtti -Wall -W -O2 -DNO_DEBUG

INCPATH = -I$(QTDIR)/include

LINK = gcc

LFLAGS =

LIBS = $(SUBLIBS) -L$(QTDIR)/lib -lqte -lm -lstdc++

MOC = $(QTDIR)/bin/moc

UIC = $(QTDIR)/bin/uic

TAR = tar -cf

GZIP = gzip -9f

####### Files

HEADERS =

SOURCES = hello.cpp

OBJECTS = hello.o

INTERFACES =

UICDECLS =

UICIMPLS =

SRCMOC =

OBJMOC =

DIST =

TARGET = hello

INTERFACE_DECL_PATH = .

####### Implicit rules

.SUFFIXES: .cpp .cxx .cc .C .c

.cpp.o:

$(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<

.cxx.o:

$(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<

.cc.o:

$(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<

.C.o:

$(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<

.c.o:

$(CC) -c $(CFLAGS) $(INCPATH) -o $@ $<

####### Build rules

all: $(TARGET)

$(TARGET): $(UICDECLS) $(OBJECTS) $(OBJMOC) 

$(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJMOC) $(LIBS)

moc: $(SRCMOC)

tmake: Makefile

Makefile: hello.pro

tmake hello.pro -o Makefile

dist:

$(TAR) hello.tar hello.pro $(SOURCES) $(HEADERS) $(INTERFACES) $(DIST)

$(GZIP) hello.tar

clean:

-rm -f $(OBJECTS) $(OBJMOC) $(SRCMOC) $(UICIMPLS) $(UICDECLS) $(TARGET)

-rm -f *~ core

####### Sub-libraries

###### Combined headers

####### Compile

hello.o: hello.cpp


程序执行结果:

image


本文转自feisky博客园博客,原文链接:http://www.cnblogs.com/feisky/archive/2009/11/08/1598397.html,如需转载请自行联系原作者


相关文章
|
1月前
|
安全 Linux 编译器
BigCloud Enterprise Linux 8和Rocky Linux 8升级OpenSSH步骤
本文介绍了在BigCloud Enterprise Linux 8.2/8.6和Rocky Linux 8.10上升级OpenSSH的详细步骤。首先配置Telnet服务和GCC编译器以确保远程登录安全,接着备份旧版OpenSSH并下载、编译、安装最新版本(如9.9p1)。然后创建新的sshd系统服务配置文件,调整配置并启动服务。最后验证升级效果,关闭不必要的Telnet服务,并处理可能的防火墙和SELinux问题。通过这些步骤可有效修复低版本OpenSSH带来的高危漏洞。
123 13
|
7月前
|
安全 Linux Shell
Linux上执行内存中的脚本和程序
【9月更文挑战第3天】在 Linux 系统中,可以通过多种方式执行内存中的脚本和程序:一是使用 `eval` 命令直接执行内存中的脚本内容;二是利用管道将脚本内容传递给 `bash` 解释器执行;三是将编译好的程序复制到 `/dev/shm` 并执行。这些方法虽便捷,但也需谨慎操作以避免安全风险。
307 6
|
8月前
|
网络协议 Linux
Linux查看端口监听情况,以及Linux查看某个端口对应的进程号和程序
Linux查看端口监听情况,以及Linux查看某个端口对应的进程号和程序
851 2
|
8月前
|
Linux Python
linux上根据运行程序的进程号,查看程序所在的绝对路径。linux查看进程启动的时间
linux上根据运行程序的进程号,查看程序所在的绝对路径。linux查看进程启动的时间
139 2
|
5月前
|
NoSQL Linux PHP
如何在不同操作系统上安装 Redis 服务器,包括 Linux 和 Windows 的具体步骤
本文介绍了如何在不同操作系统上安装 Redis 服务器,包括 Linux 和 Windows 的具体步骤。接着,对比了两种常用的 PHP Redis 客户端扩展:PhpRedis 和 Predis,详细说明了它们的安装方法及优缺点。最后,提供了使用 PhpRedis 和 Predis 在 PHP 中连接 Redis 服务器及进行字符串、列表、集合和哈希等数据类型的基本操作示例。
280 4
|
7月前
|
C语言 Android开发 C++
基于MTuner软件进行qt的mingw编译程序的内存泄漏检测
本文介绍了使用MTuner软件进行Qt MinGW编译程序的内存泄漏检测的方法,提供了MTuner的下载链接和测试代码示例,并通过将Debug程序拖入MTuner来定位内存泄漏问题。
142 4
基于MTuner软件进行qt的mingw编译程序的内存泄漏检测
|
6月前
|
运维 Java Linux
【运维基础知识】Linux服务器下手写启停Java程序脚本start.sh stop.sh及详细说明
### 启动Java程序脚本 `start.sh` 此脚本用于启动一个Java程序,设置JVM字符集为GBK,最大堆内存为3000M,并将程序的日志输出到`output.log`文件中,同时在后台运行。 ### 停止Java程序脚本 `stop.sh` 此脚本用于停止指定名称的服务(如`QuoteServer`),通过查找并终止该服务的Java进程,输出操作结果以确认是否成功。
279 1
|
7月前
|
消息中间件 分布式计算 Java
Linux环境下 java程序提交spark任务到Yarn报错
Linux环境下 java程序提交spark任务到Yarn报错
90 5
|
7月前
|
NoSQL Linux Redis
linux安装单机版redis详细步骤,及python连接redis案例
这篇文章提供了在Linux系统中安装单机版Redis的详细步骤,并展示了如何配置Redis为systemctl启动,以及使用Python连接Redis进行数据操作的案例。
163 3
下一篇
oss创建bucket