源代码下载: learnqt-cn.cpp
Qt Qt是一个广为人知的框架,用于开发跨平台软件,该软件可以在各种软件和硬件平台上运行,代码几乎没有变化,同时具有本机应用程序的能力和速度。虽然Qt最初是用C++,但也有其他语言的端口: PyQt, QtRuby, PHP-Qt, 等等.
Qt 非常适合使用图形用户界面 (GUI) 创建应用程序。本教程是关于如何用C++去实现。
/*
* 让我们从最经典的开始
*/
// Qt框架的所有标头均以大写字母'Q'开头
#include <QApplication>
#include <QLineEdit>
int main(int argc, char *argv[]) {
// 创建一个对象来管理应用程序范围内的资源
QApplication app(argc, argv);
// 创建行编辑widgets并在屏幕上显示
QLineEdit lineEdit("Hello world!");
lineEdit.show();
// 启动应用程序的事件循环
return app.exec();
}
Qt与 GUI 相关的部分与widgets及其之间的connection有关。
/*
* 让我们创建一个标签和一个按钮。
* 按下按钮时应显示一个标签。
* Qt代码本身就可以说明问题。
*/
#include <QApplication>
#include <QDialog>
#include <QVBoxLayout>
#include <QPushButton>
#include <QLabel>
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
QDialog dialogWindow;
dialogWindow.show();
// 添加垂直布局
QVBoxLayout layout;
dialogWindow.setLayout(&layout);
QLabel textLabel("Thanks for pressing that button");
layout.addWidget(&textLabel);
textLabel.hide();
QPushButton button("Press me");
layout.addWidget(&button);
// 按下按钮时显示隐藏标签
QObject::connect(&button, &QPushButton::pressed,
&textLabel, &QLabel::show);
return app.exec();
}
注意,QObject :: connect部分。 此方法用于将一个对象的SIGNAL连接到另一个对象的SLOTS。
Signals 会被发出当对象发生某些事情时,例如当用户按下QPushButton对象时会发出push的信号。
Slots 是可以响应于接收到的信号而执行的action。
接下来,让我们了解到我们不仅可以使用标准的wigets,而且可以通过继承扩展其行为。 让我们创建一个按钮并计算其被按下的次数。 为此,我们定义了自己的类* CounterLabel *。 由于特定的Qt体系结构,必须在单独的文件中声明它。
// counterlabel.hpp
#ifndef COUNTERLABEL
#define COUNTERLABEL
#include <QLabel>
class CounterLabel : public QLabel {
Q_OBJECT // 在每个自定义wiget中必须存在的Qt定义的宏
public:
CounterLabel() : counter(0) {
setText("Counter has not been increased yet"); // QLabel方法
}
public slots:
// 将响应按钮按下而调用的操作
void increaseCounter() {
setText(QString("Counter value: %1").arg(QString::number(++counter)));
}
private:
int counter;
};
#endif // COUNTERLABEL
// main.cpp
// 与前面的示例几乎相同
#include <QApplication>
#include <QDialog>
#include <QVBoxLayout>
#include <QPushButton>
#include <QString>
#include "counterlabel.hpp"
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
QDialog dialogWindow;
dialogWindow.show();
QVBoxLayout layout;
dialogWindow.setLayout(&layout);
CounterLabel counterLabel;
layout.addWidget(&counterLabel);
QPushButton button("Push me once more");
layout.addWidget(&button);
QObject::connect(&button, &QPushButton::pressed,
&counterLabel, &CounterLabel::increaseCounter);
return app.exec();
}
当然,Qt框架比本教程介绍的部分要复杂得多,因此请仔细阅读和练习。
祝你好运,生活愉快!
有建议?或者发现什么错误?在GitHub上开一个issue,或者发起pull request!
原著Aleksey Kholovchuk,并由3个好心人修改。