原文: http://zetcode.com/gui/qt5/firstprograms/

在 Qt5 C++ 编程教程的这一部分中,我们创建了第一个程序。

我们显示一个应用图标,一个工具提示和各种鼠标光标。 我们在屏幕上居中放置一个窗口,并介绍信号和槽机制。

简单的例子

我们从一个非常简单的例子开始。

simple.cpp

  1. #include <QApplication>
  2. #include <QWidget>
  3. int main(int argc, char *argv[]) {
  4. QApplication app(argc, argv);
  5. QWidget window;
  6. window.resize(250, 150);
  7. window.setWindowTitle("Simple example");
  8. window.show();
  9. return app.exec();
  10. }

该示例在屏幕上显示一个基本窗口。

  1. #include <QApplication>
  2. #include <QWidget>

我们包括必要的头文件。

  1. QApplication app(argc, argv);

这是应用对象。 每个 Qt5 应用都必须创建此对象。 (控制台应用除外。)

  1. QWidget window;

这是我们的主要小部件。

  1. window.resize(250, 150);
  2. window.setWindowTitle("Simple example");
  3. window.show();

在这里,我们调整窗口小部件的大小并为我们的主窗口设置标题。 在这种情况下,QWidget是我们的主窗口。 最后,我们在屏幕上显示小部件。

  1. return app.exec();

exec()方法启动应用的主循环。

Qt5 中的第一个程序 - 图1

图:简单 example

工具提示

工具提示是有关应用中项目的特定提示。 以下示例将演示如何在 Qt5 编程库中创建工具提示。

tooltip.cpp

  1. #include <QApplication>
  2. #include <QWidget>
  3. int main(int argc, char *argv[]) {
  4. QApplication app(argc, argv);
  5. QWidget window;
  6. window.resize(250, 150);
  7. window.move(300, 300);
  8. window.setWindowTitle("ToolTip");
  9. window.setToolTip("QWidget");
  10. window.show();
  11. return app.exec();
  12. }

该示例显示了主QWidget的工具提示。

  1. window.setWindowTitle("ToolTip");

我们使用setToolTip()方法为QWidget小部件设置了工具提示。

Qt5 中的第一个程序 - 图2

图:工具提示

应用图标

在下一个示例中,我们显示应用图标。 大多数窗口管理器在标题栏的左上角以及任务栏上都显示图标。

icon.cpp

  1. #include <QApplication>
  2. #include <QWidget>
  3. #include <QIcon>
  4. int main(int argc, char *argv[]) {
  5. QApplication app(argc, argv);
  6. QWidget window;
  7. window.resize(250, 150);
  8. window.setWindowTitle("Icon");
  9. window.setWindowIcon(QIcon("web.png"));
  10. window.show();
  11. return app.exec();
  12. }

窗口左上角显示一个图标。

  1. window.setWindowIcon(QIcon("web.png"));

为了显示图标,我们使用setWindowIcon()方法和QIcon类。 该图标是位于当前工作目录中的一个小 PNG 文件。

Qt5 中的第一个程序 - 图3

图:图标

光标

光标是一个小图标,指示鼠标指针的位置。 在下一个示例中,将显示我们可以在程序中使用的各种游标。

cursors.cpp

  1. #include <QApplication>
  2. #include <QWidget>
  3. #include <QFrame>
  4. #include <QGridLayout>
  5. class Cursors : public QWidget {
  6. public:
  7. Cursors(QWidget *parent = 0);
  8. };
  9. Cursors::Cursors(QWidget *parent)
  10. : QWidget(parent) {
  11. QFrame *frame1 = new QFrame(this);
  12. frame1->setFrameStyle(QFrame::Box);
  13. frame1->setCursor(Qt::SizeAllCursor);
  14. QFrame *frame2 = new QFrame(this);
  15. frame2->setFrameStyle(QFrame::Box);
  16. frame2->setCursor(Qt::WaitCursor);
  17. QFrame *frame3 = new QFrame(this);
  18. frame3->setFrameStyle(QFrame::Box);
  19. frame3->setCursor(Qt::PointingHandCursor);
  20. QGridLayout *grid = new QGridLayout(this);
  21. grid->addWidget(frame1, 0, 0);
  22. grid->addWidget(frame2, 0, 1);
  23. grid->addWidget(frame3, 0, 2);
  24. setLayout(grid);
  25. }
  26. int main(int argc, char *argv[]) {
  27. QApplication app(argc, argv);
  28. Cursors window;
  29. window.resize(350, 150);
  30. window.setWindowTitle("Cursors");
  31. window.show();
  32. return app.exec();
  33. }

在此示例中,我们使用三个框架。 每个帧都有一个不同的光标集。

  1. QFrame *frame1 = new QFrame(this);

QFrame小部件已创建。

  1. frame1->setFrameStyle(QFrame::Box);

我们使用setFrameStyle()方法设置框架样式。 这样我们可以看到框架的边界。

  1. frame1->setCursor(Qt::SizeAllCursor);

使用setCursor()方法将光标设置到该帧。

  1. QGridLayout *grid = new QGridLayout(this);
  2. grid->addWidget(frame1, 0, 0);
  3. grid->addWidget(frame2, 0, 1);
  4. grid->addWidget(frame3, 0, 2);
  5. setLayout(grid);

这会将所有帧分组为一行。 我们将在布局管理一章中详细讨论这一点。

QButton

在下一个代码示例中,我们在窗口上显示一个按钮。 通过单击按钮,我们关闭应用。

pushbutton.cpp

  1. #include <QApplication>
  2. #include <QWidget>
  3. #include <QPushButton>
  4. class MyButton : public QWidget {
  5. public:
  6. MyButton(QWidget *parent = 0);
  7. };
  8. MyButton::MyButton(QWidget *parent)
  9. : QWidget(parent) {
  10. QPushButton *quitBtn = new QPushButton("Quit", this);
  11. quitBtn->setGeometry(50, 40, 75, 30);
  12. connect(quitBtn, &QPushButton::clicked, qApp, &QApplication::quit);
  13. }
  14. int main(int argc, char *argv[]) {
  15. QApplication app(argc, argv);
  16. MyButton window;
  17. window.resize(250, 150);
  18. window.setWindowTitle("QPushButton");
  19. window.show();
  20. return app.exec();
  21. }

在此代码示例中,我们首次使用信号和槽的概念。

  1. QPushButton *quitBtn = new QPushButton("Quit", this);
  2. quitBtn->setGeometry(50, 40, 75, 30);

我们创建一个新的QPushButton。 我们手动调整其大小,然后使用setGeometry()方法将其放置在窗口中。

  1. connect(quitBtn, &QPushButton::clicked, qApp, &QApplication::quit);

当我们点击按钮时,会产生一个clicked信号。 时隙是对信号做出反应的方法。 在我们的情况下,它是主应用对象的quit槽。 qApp是指向应用对象的全局指针。 它在QApplication头文件中定义。

Qt5 中的第一个程序 - 图4

图:QPushButton

PlusMinus

我们将在本节完成,展示小部件如何进行通信。 该代码分为三个文件。

plusminus.h

  1. #pragma once
  2. #include <QWidget>
  3. #include <QApplication>
  4. #include <QPushButton>
  5. #include <QLabel>
  6. class PlusMinus : public QWidget {
  7. Q_OBJECT
  8. public:
  9. PlusMinus(QWidget *parent = 0);
  10. private slots:
  11. void OnPlus();
  12. void OnMinus();
  13. private:
  14. QLabel *lbl;
  15. };

这是示例的头文件。 在此文件中,我们定义了两个槽和一个标签小部件。

  1. class PlusMinus : public QWidget {
  2. Q_OBJECT
  3. ...

Q_OBJECT宏必须包含在声明自己的信号和槽的类中。

plusminus.cpp

  1. #include "plusminus.h"
  2. #include <QGridLayout>
  3. PlusMinus::PlusMinus(QWidget *parent)
  4. : QWidget(parent) {
  5. QPushButton *plsBtn = new QPushButton("+", this);
  6. QPushButton *minBtn = new QPushButton("-", this);
  7. lbl = new QLabel("0", this);
  8. QGridLayout *grid = new QGridLayout(this);
  9. grid->addWidget(plsBtn, 0, 0);
  10. grid->addWidget(minBtn, 0, 1);
  11. grid->addWidget(lbl, 1, 1);
  12. setLayout(grid);
  13. connect(plsBtn, &QPushButton::clicked, this, &PlusMinus::OnPlus);
  14. connect(minBtn, &QPushButton::clicked, this, &PlusMinus::OnMinus);
  15. }
  16. void PlusMinus::OnPlus() {
  17. int val = lbl->text().toInt();
  18. val++;
  19. lbl->setText(QString::number(val));
  20. }
  21. void PlusMinus::OnMinus() {
  22. int val = lbl->text().toInt();
  23. val--;
  24. lbl->setText(QString::number(val));
  25. }

我们有两个按钮和一个标签小部件。 我们使用按钮增加或减少标签上显示的数字。

  1. connect(plsBtn, &QPushButton::clicked, this, &PlusMinus::OnPlus);
  2. connect(minBtn, &QPushButton::clicked, this, &PlusMinus::OnMinus);

在这里,我们将clicked信号连接到它们的槽。

  1. void PlusMinus::OnPlus() {
  2. int val = lbl->text().toInt();
  3. val++;
  4. lbl->setText(QString::number(val));
  5. }

OnPlus()方法中,我们确定标签的当前值。 标签窗口小部件显示一个字符串值,因此我们必须将其转换为整数。 我们增加数量并为标签设置新的文本。 我们将数字转换为字符串值。

main.cpp

  1. #include "plusminus.h"
  2. int main(int argc, char *argv[]) {
  3. QApplication app(argc, argv);
  4. PlusMinus window;
  5. window.resize(300, 190);
  6. window.setWindowTitle("Plus minus");
  7. window.show();
  8. return app.exec();
  9. }

这是代码示例的主文件。

Qt5 中的第一个程序 - 图5

图:正负

在本章中,我们在 Qt5 中创建了第一个程序。