Qt5 C++14教程--Widgets

在Qt5 C++编程教程的这一部分,我们将讨论一些基本的Qt5窗口部件。我们有QLabel、QSlider、QComboBox、QSpinBox、QLineEdit和QMainWindow部件的例子。

部件是GUI应用程序的基本构建块。Qt5库有丰富的各种widget的集合。

目录

Qt5 QLabel

Qt5 QSlider

QComboBox

QSpinBox

QLineEdit

状态栏


Qt5 QLabel

QLabel用于显示文本和图像,无法进行用户交互。下面的示例显示文本。

label.h
#pragma once

#include <QWidget>
#include <QLabel>

class Label : public QWidget {

  public:
    Label(QWidget *parent = nullptr);

  private:
    QLabel *label;
};


label.cpp
#include <QVBoxLayout>
#include <QFont>
#include "label.h"

Label::Label(QWidget *parent)
    : QWidget(parent) {

  QString lyrics = "Who doesn't long for someone to hold\n\
Who knows how to love you without being told\n\
Somebody tell me why I'm on my own\n\
If there's a soulmate for everyone\n\
\n\
Here we are again, circles never end\n\
How do I find the perfect fit\n\
There's enough for everyone\n\
But I'm still waiting in line\n\
\n\
Who doesn't long for someone to hold\n\
Who knows how to love you without being told\n\
Somebody tell me why I'm on my own\n\
If there's a soulmate for everyone";

  label = new QLabel(lyrics, this);
  label->setFont(QFont("Purisa", 10));

  auto *vbox = new QVBoxLayout();
  vbox->addWidget(label);
  setLayout(vbox);
}

我们使用QLabel部件在窗口中显示歌词。

label = new QLabel(lyrics, this);

label->setFont(QFont("Purisa", 10));

我们创建一个标签部件并为其设置特定的字体。

main.cpp
#include <QApplication>
#include <QTextStream>
#include "label.h"

int main(int argc, char *argv[]) {

  QApplication app(argc, argv);

  Label window;

  window.setWindowTitle("QLabel");
  window.show();

  return app.exec();
}

这是主文件。

Qt5 QSlider

QSlider 是一个带有简单句柄的窗口部件。这个句柄可以来回移动,以此来选择特定任务的值。

slider.h
#pragma once

#include <QWidget>
#include <QSlider>
#include <QLabel>

class Slider : public QWidget {

  Q_OBJECT

  public:
    Slider(QWidget *parent = nullptr);

  private:
    QSlider *slider;
    QLabel *label;
};
The header file for the example.

slider.cpp
#include <QHBoxLayout>
#include "slider.h"

Slider::Slider(QWidget *parent)
    : QWidget(parent) {

  auto *hbox = new QHBoxLayout(this);

  slider = new QSlider(Qt::Horizontal , this);
  hbox->addWidget(slider);

  label = new QLabel("0", this);
  hbox->addWidget(label);

//   connect(slider, &QSlider::valueChanged, label,
//     static_cast<void (QLabel::*)(int)>(&QLabel::setNum));

  connect(slider, &QSlider::valueChanged, label,
    qOverload<int>(&QLabel::setNum));
}

我们显示了两个窗口部件:一个滑块和一个标签。滑块控制标签中显示的数字。

slider = new QSlider(Qt::Horizontal , this);

创建了一个水平 QSlider。

connect(slider, &QSlider::valueChanged, label, qOverload<int>(&QLabel::setNum));

在这行代码中,我们将 valueChanged 信号连接到标签的内置 setNum 槽。由于 setNum 方法是重载的,我们使用 qOverload 来选择正确的方法。

main.cpp
#include <QApplication>
#include "slider.h"

int main(int argc, char *argv[]) {

  QApplication app(argc, argv);

  Slider window;

  window.setWindowTitle("QSlider");
  window.show();

  return app.exec();
}

这是主文件。

QComboBox

QComboBox 是一个小部件,以最小的屏幕空间向用户呈现选项列表。它是一个选择小部件,显示当前项,并可以弹出可选项的列表。ComboBox 可以是可编辑的,允许用户修改列表中的每个项。

combobox.h
#pragma once

#include <QWidget>
#include <QComboBox>
#include <QLabel>

class ComboBoxEx : public QWidget {

  Q_OBJECT

  public:
    ComboBoxEx(QWidget *parent = nullptr);

  private:
    QComboBox *combo;
    QLabel *label;
};


combobox.cpp
#include <QHBoxLayout>
#include "combobox.h"

ComboBoxEx::ComboBoxEx(QWidget *parent)
    : QWidget(parent) {

  QStringList distros = {"Arch", "Xubuntu", "Redhat", "Debian",
      "Mandriva"};

  auto *hbox = new QHBoxLayout(this);

  combo = new QComboBox();
  combo->addItems(distros);

  hbox->addWidget(combo);
  hbox->addSpacing(15);

  label = new QLabel("Arch", this);
  hbox->addWidget(label);

  connect(combo, qOverload<const QString &>(&QComboBox::activated),
      label, &QLabel::setText);
}

在这个例子中,从组合框中选择的项显示在标签中。

QStringList distros = {"Arch", "Xubuntu", "Redhat", "Debian", "Mandriva"};

QStringList 存储组合框的数据。我们有一个 Linux 发行版列表。

combo = new QComboBox();

combo->addItems(distros);

创建了一个 QComboBox 并使用 addItems 方法插入了项。

connect(combo, qOverload<const QString &>(&QComboBox::activated), label, &QLabel::setText);

将组合框的 activated 信号连接到标签的 setText 插槽。

main.cpp
#include <QApplication>
#include "combobox.h"

int main(int argc, char *argv[]) {

  QApplication app(argc, argv);

  ComboBoxEx window;

  window.resize(300, 150);
  window.setWindowTitle("QComboBox");
  window.show();

  return app.exec();
}

这是应用程序的主要文件。

QSpinBox

QSpinBox 是一个用于处理整数和离散值集合的小部件。在我们的代码示例中,我们将拥有一个 QSpinBox 小部件,可以选择 0 到 99 的数字。当前选择的值将显示在 QLabel 小部件中。

spinbox.h
#pragma once

#include <QWidget>
#include <QSpinBox>

class SpinBox : public QWidget {

  Q_OBJECT

  public:
    SpinBox(QWidget *parent = nullptr);

  private:
    QSpinBox *spinbox;
};


spinbox.cpp
#include <QHBoxLayout>
#include <QLabel>
#include "spinbox.h"

SpinBox::SpinBox(QWidget *parent)
    : QWidget(parent) {

  auto *hbox = new QHBoxLayout(this);
  hbox->setSpacing(15);

  spinbox = new QSpinBox(this);
  auto *lbl = new QLabel("0", this);

  hbox->addWidget(spinbox);
  hbox->addWidget(lbl);

  connect(spinbox, qOverload<int>(&QSpinBox::valueChanged),
    lbl, qOverload<int>(&QLabel::setNum));
}

我们在窗口上放置了一个 QSpinBox,并将其 valueChanged 信号连接到 QLabel 的 setNum 槽。

connect(spinbox, qOverload<int>(&QSpinBox::valueChanged), lbl, qOverload<int>(&QLabel::setNum));

我们需要使用两次 qOverload,因为信号和槽都是重载的。

main.cpp
Advertisements

#include <QApplication>
#include "spinbox.h"

int main(int argc, char *argv[]) {

  QApplication app(argc, argv);

  SpinBox window;

  window.resize(250, 150);
  window.setWindowTitle("QSpinBox");
  window.show();

  return app.exec();
}

这是主文件。

QLineEdit

QLineEdit是一个小部件,允许输入和编辑单行纯文本。QLineEdit小部件可用撤销/重做、剪切/粘贴和拖放功能。

在我们的示例中,我们显示了三个标签和三个行编辑器。

ledit.h
#pragma once

#include <QWidget>

class Ledit : public QWidget {

  public:
    Ledit(QWidget *parent = nullptr);
};


ledit.cpp
#include <QGridLayout>
#include <QLabel>
#include <QLineEdit>
#include "ledit.h"

Ledit::Ledit(QWidget *parent)
    : QWidget(parent) {

  auto *name = new QLabel("Name:", this);
  name->setAlignment(Qt::AlignRight | Qt::AlignVCenter);

  auto *age = new QLabel("Age:", this);
  age->setAlignment(Qt::AlignRight | Qt::AlignVCenter);

  auto *occupation = new QLabel("Occupation:", this);
  occupation->setAlignment(Qt::AlignRight | Qt::AlignVCenter);

  auto *le1 = new QLineEdit(this);
  auto *le2 = new QLineEdit(this);
  auto *le3 = new QLineEdit(this);

  auto *grid = new QGridLayout();

  grid->addWidget(name, 0, 0);
  grid->addWidget(le1, 0, 1);
  grid->addWidget(age, 1, 0);
  grid->addWidget(le2, 1, 1);
  grid->addWidget(occupation, 2, 0);
  grid->addWidget(le3, 2, 1);

  setLayout(grid);
}

我们显示了三个标签和三个行编辑器。这些小部件是使用QGridLayout管理器组织的。

main.cpp
#include "ledit.h"
#include <QApplication>

int main(int argc, char *argv[]) {

  QApplication app(argc, argv);

  Ledit window;

  window.setWindowTitle("QLineEdit");
  window.show();

  return app.exec();
}

这是主文件。

状态栏

状态栏是用于显示应用程序状态信息的面板。

在我们的例子中,有两个按钮和一个状态栏。每个按钮在点击时会显示一个消息。状态栏小部件是 QMainWindow 小部件的一部分。

statusbar.h
#pragma once

#include <QMainWindow>
#include <QPushButton>

class Statusbar : public QMainWindow {

  Q_OBJECT

  public:
    Statusbar(QWidget *parent = nullptr);

  private slots:
    void OnOkPressed();
    void OnApplyPressed();

  private:
    QPushButton *okBtn;
    QPushButton *aplBtn;
};


statusbar.cpp
#include <QLabel>
#include <QFrame>
#include <QStatusBar>
#include <QHBoxLayout>
#include "statusbar.h"

Statusbar::Statusbar(QWidget *parent)
    : QMainWindow(parent) {

  auto *frame = new QFrame(this);
  setCentralWidget(frame);

  auto *hbox = new QHBoxLayout(frame);

  okBtn = new QPushButton("OK", frame);
  hbox->addWidget(okBtn, 0, Qt::AlignLeft | Qt::AlignTop);

  aplBtn = new QPushButton("Apply", frame);
  hbox->addWidget(aplBtn, 1, Qt::AlignLeft | Qt::AlignTop);

  statusBar();

  connect(okBtn, &QPushButton::clicked, this, &Statusbar::OnOkPressed);
  connect(aplBtn, &QPushButton::clicked, this, &Statusbar::OnApplyPressed);
}

void Statusbar::OnOkPressed() {

  statusBar()->showMessage("OK button pressed", 2000);
}

void Statusbar::OnApplyPressed() {

 statusBar()->showMessage("Apply button pressed", 2000);
}

auto *frame = new QFrame(this);

setCentralWidget(frame);

创建了一个 QFrame 小部件并将其放置在 QMainWindow 小部件的中心区域。中心区域只能容纳一个小部件。

okBtn = new QPushButton("OK", frame);

hbox->addWidget(okBtn, 0, Qt::AlignLeft | Qt::AlignTop);

aplBtn = new QPushButton("Apply", frame);

hbox->addWidget(aplBtn, 1, Qt::AlignLeft | Qt::AlignTop);

创建了两个 QPushButton 小部件,并将它们放置在一个水平盒子中。按钮的父对象是 frame 小部件。

statusBar();

调用 QMainWindow 小部件的 statusBar 方法来显示状态栏小部件。

void Statusbar::OnOkPressed() {

  statusBar()->showMessage("OK button pressed", 2000);
}

showMessage 方法在状态栏上显示消息。最后一个参数指定消息在状态栏上显示的毫秒数。

main.cpp
#include <QApplication>
#include "statusbar.h"

int main(int argc, char *argv[]) {

  QApplication app(argc, argv);

  Statusbar window;

  window.resize(300, 200);
  window.setWindowTitle("QStatusBar");
  window.show();

  return app.exec();
}

这是主文件。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值