一、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,一起来学习吧,欢迎各种收藏/转发/批评。