qt connect函数_Qt入门_运行几个小demo

一、Hello Qt

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

d3cf180bf3f67012228660f385a65811.png

核心代码:

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

d3cf180bf3f67012228660f385a65811.png

可以使用HTML样式:

dbebbc6be4ca9a4c8a80d184570fadcd.png

二、建立连接

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

92411f930a3dee41475c367f731c1644.png

核心代码:

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

ba2460a9833cd8e6d9759cdbd2cacdf8.gif

三、窗口布局

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

d809b06b8cc3b8bf0de8f466b99f4f73.png

核心代码:

    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

e63ae316cf2d03efc037cbbe7cabb28f.gif

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值