找回密码
 立即注册
Qt开源社区 门户 查看内容

Qt入门_运行几个小demo

2019-7-15 16:34| 发布者: admin| 查看: 756| 评论: 0

摘要: 一、Hello Qt001_hello会显示一个带“Hello Qt”文本框(QLabel)的小窗口,界面如下:核心代码:int main(int argc, char *argv) { QApplication app(argc, argv); QLabel *label = new QLabel("Hello Qt! ...
一、Hello Qt

001_hello会显示一个带“Hello Qt”文本框(QLabel)的小窗口,界面如下:



核心代码:
int main(int argc, char *argv[]) { QApplication app(argc, argv); QLabel *label = new QLabel("Hello Qt!"); label->show(); app.exec(); }
命令行编译:
$ qmake -project$ qmake ${PRJ}.pro$ make
报错:
hello.cpp:1:24: fatal error: QApplication: No such file or directory

解决办法:

对比Qt Creator 创建的.pro文件,发现Creator创建的pro多了:
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets 手动往pro文件里添加上面这句话就OK了。

什么原因?
$ locate QApplication/opt/Qt5.9.8/5.9.8/gcc_64/include/QtWidgets/QApplication$ cat /opt/Qt5.9.8/5.9.8/gcc_64/include/QtWidgets/qapplication.h
可以确定Qt5将大部分控件(包括QApplication)移到了Qt Widgets模块中了,这跟Qt4是不一样的。

运行效果:
$ ./001_hello


可以使用HTML样式:



二、建立连接

002_quit会显示一个带有"Quit"按键(QPushButton)的小窗口,点击"Quit"按键后窗口会退出,用于说明Qt是如何响应用户的动作,界面如下:



核心代码:
int main(int argc, char *argv[]) { QApplication app(argc, argv); QPushButton *button = new QPushButton("Quit"); QObject::connect(button, SIGNAL(clicked()), &app, SLOT(quit())); button->show(); app.exec(); }

  • Qt通过发射信号(signal,本质就是一个普通函数,跟UNIX系统的信号不是一回事)来表明某个状态发生了改变,然后会自动执行槽函数(slot)来进行相应的处理;

  • 信号函数和槽函数通过QObject::connect来绑定在一起,加上QObject::是为了防止命名冲突,简单看下connect函数的定义:

  • SIGNAL()和SLOT()是Qt定义的2个宏,并不是特殊的C++语法:#define SLOT(arg) #arg #define SIGNAL(arg) #arg 返回的不过就是一串字符串罢了,例如SLOT(clicked()返回的是字符串“clicked()”。

  • 在本例中QPushButton对象的clicked()信号函数和QApplicaiton对象的quit()槽函数被绑定在一起;

运行效果:
$ ./build.sh // 将上个例子的编译命令整理成build.sh$ ./002_quit


三、窗口布局

003_age会显示一个带有微调框(QSpinBox)和滑块(QSlider)的窗口(QWidget),用于说明如何使用布局器(QHBoxLayout)来控制控件的显示位置,同时还可以说明如何利用信号和槽来同步控件,界面如下:



核心代码:
QWidget *window = new QWidget; window->setWindowTitle("Enter your age");
QSpinBox *spinbox = new QSpinBox; spinbox->setRange(0, 130); QSlider *slider = new QSlider; slider->setRange(0, 130); slider->setOrientation(Qt::Horizontal);
QObject::connect(spinbox, SIGNAL(valueChanged(int)),slider, SLOT(setValue(int))); QObject::connect(slider, SIGNAL(valueChanged(int)),spinbox, SLOT(setValue(int)));
slider->setValue(35);
QHBoxLayout *layout = new QHBoxLayout; layout->addWidget(spinbox); layout->addWidget(slider); window->setLayout(layout); window->show();

  • 布局器是一个能够对其负责的控件的大小和位置进行设置的对象,QHBoxLayout是水平布局器,Qt5有4种布局器:

  • 创建QSpinBox和QSlider对象时并没有将QWidget对象作为其父对象,这是因为待会使用布局对象时,布局系统会自动将QWidget对象设置为QSPinBox和QSlider的父对象,所以没必要显示设置;

  • 当执行window->setLayout(layout)时,会在窗口上安装布局器,此时QSpinBox和QSlider会自动重定义父对象为window;

运行效果:
$ ./build.sh
$ ./003_age



到此,几个入门的Qt小demo就展示完毕了。

参考:
《C++ GUI Qt4 编程》

你和我各有一个苹果,如果我们交换苹果的话,我们还是只有一个苹果。但当你和我各有一个想法,我们交换想法的话,我们就都有两个想法了。如果你也对嵌入式系统开发有兴趣,并且想和更多人互相交流学习的话,请关注我的公众号:ESexpert,一起来学习吧,欢迎各种收藏/转发/批评。


----------------------------------------------------------------------------------------------------------------------
我们尊重原创,也注重分享,文章来源于微信公众号:嵌入式系统砖家,建议关注公众号查看原文。如若侵权请联系qter@qter.org。
----------------------------------------------------------------------------------------------------------------------

1人点赞鲜花

握手

雷人

路过

鸡蛋

刚表态过的朋友 (1 人)


公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了