RxCpp(四)Qt/GUI编程
2019-10-24 本文已影响0人
龙翱天际
Qt简介
Qt(发音可爱)生态系统是一个全面的基于c++的框架,用于编写跨平台和多平台GUI应用程序。如果使用库的可移植核心编写程序,则可以利用框架支持的一次编写和到处编译范例。在某些情况下,人们使用特定于平台的特性,比如支持Activex编程模型来编写基于windows的应用程序。
在windows中编写应用程序时,我们会遇到qt优于mfc的情况。这样做的一个合理原因可能是易于编程,因为qt为其库使用了非常小的c++语言特性子集。当然,框架的最初目标是跨平台开发。Qt的跨平台的单一源代码可移植性、特性的丰富性、源代码的可用性以及更新良好的文档,使其成为一个非常适合程序员的框架。自1995年第一次发行以来,这帮助它在20多年的时间里蓬勃发展。
Qt提供了一个完整的接口环境,支持开发多平台GUI应用程序、webkit API、媒体、流媒体、文件系统浏览器、OpenGL API等等。
rxqt简介
rxqt库是一个写在rxcpp库上的公共域库,它使用qt事件和信号以反应性的方式进行编程变得很容易。为了理解这个库,让我们进入一个示例,这样我们就可以跟踪鼠标事件,并使用库提供的observable来过滤它们。该库的下载以及更多示例见:rxqt:
#include <QApplication>
#include <QLabel>
#include <QWidget>
#include <QVBoxLayout>
#include <QMouseEvent>
#include "rxqt.hpp"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
// Create the application window
auto widget = std::unique_ptr<QWidget>(new QWidget());
widget->resize(280, 200);
// Create and set properties of mouse area label
auto label_mouseArea = new QLabel("Mouse Area");
label_mouseArea->setMouseTracking(true);
label_mouseArea->setAlignment(Qt::AlignCenter | Qt::AlignHCenter);
label_mouseArea->setFrameStyle(2);
// Create and set properties of message display label
auto label_coordinates = new QLabel("X = 0, Y = 0");
label_coordinates->setAlignment(Qt::AlignCenter | Qt::AlignHCenter);
label_coordinates->setFrameStyle(2);
// Adjusting the size policy of widgets to allow stretching inside the vertical layout
label_mouseArea->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
label_coordinates->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
auto layout = new QVBoxLayout;
layout->addWidget(label_mouseArea);
layout->addWidget(label_coordinates);
layout->setStretch(0, 4);
layout->setStretch(1, 1);
widget->setLayout(layout);
// Display the mouse move message and the mouse coordinates
rxqt::from_event(label_mouseArea, QEvent::MouseMove)
.subscribe([&label_coordinates](const QEvent* e) {
auto me = static_cast<const QMouseEvent*>(e);
label_coordinates->setText(QString("Mouse Moving : X = %1, Y = %2")
.arg(me->x())
.arg(me->y()));
});
// Display the mouse signle click message and the mouse coordinates
rxqt::from_event(label_mouseArea, QEvent::MouseButtonPress)
.subscribe([&label_coordinates](const QEvent* e) {
auto me = static_cast<const QMouseEvent*>(e);
label_coordinates->setText(QString("Mouse Single click at X = %1, Y = %2")
.arg(me->x())
.arg(me->y()));
});
// Display the mouse double click message and the mouse coordinates
rxqt::from_event(label_mouseArea, QEvent::MouseButtonDblClick)
.subscribe([&label_coordinates](const QEvent* e) {
auto me = static_cast<const QMouseEvent*>(e);
label_coordinates->setText(QString("Mouse Double click at X = %1, Y = %2")
.arg(me->x())
.arg(me->y()));
});
widget->show();
return app.exec();
} // End of main