Qt中常见控件、布局、信号和槽的简单介绍与实现

目录

Qt提供的4种布局

垂直布局(VBoxLayout):垂直管理器类似,它可以把它所管理的部件以垂直的顺序依次排开
水平布局(HBoxLayout):水平布局管理器可以把它所管理的部件以水平的顺序依次排开
二维布局(GridLayout):Grid布局管理器可以以网格的形式,将它所管理的部件以一定的矩阵形式排列
窗体布局(FormLayout) :窗体布局管理器为表单特殊设计的布局,其xtype值为form。(暂时没用过这种布局)

几种常见控件

QDialog类:对话框窗口的基类
构造函数:

explicit QDialog(QWidget *parent = 0, Qt::WindowFlags f = 0);

QLineEdit 类:代表编程框,它可以让用户输入一个单行文本。
构造函数:

QLineEdit (QWidget *parent = 0);  
QLineEdit(const QString &contents, QWidget *parent = 0);

QPushButton类:窗口部件提供了命令按钮。
构造函数:

explicit QPushButton(QWidget *parent=0);
explicit QPushButton(const QString &text, QWidget *parent=0);
QPushButton(const QIcon& icon, const QString &text, QWidget *parent=0);

QLineEdit 类:代表编程框,它可以让用户输入一个单行文本。
构造函数:

explicit QLineEdit(QWidget* parent=0);
explicit QLineEdit(const QString &, QWidget* parent=0);

QLabel类:标签类,它从QFrame下继承。

explicit QLabel(QWidget *parent=0, Qt::WindowFlags f=0);
explicit QLabel(const QString &text, QWidget *parent=0, Qt::WindowFlags f=0);

信号和槽

在类中定义:

private slots:      //Qt独有的信号和槽
    void on_clicked();

在Winget类的构造函数中定义:

connect(but1, SIGNAL(clicked()), this, SLOT(on_clicked()));

表示当点击了btn1的时候就调用on_clicked()这个函数
实现控件与具体的槽函数关联

connect的几个重载函数:

static QMetaObject::Connection connect(const QObject *sender, const char *signal,
                      const QObject *receiver, const char *member, Qt::ConnectionType                     = Qt::AutoConnection);

static QMetaObject::Connection connect(const QObject *sender, const QMetaMethod &signal,
                        const QObject *receiver, const QMetaMethod &method,
                        Qt::ConnectionType type = Qt::AutoConnection);

inline QMetaObject::Connection connect(const QObject *sender, const char *signal,
                        const char *member, Qt::ConnectionType type = Qt::AutoConnection) const;

实现

写了实现加减乘除简单计算功能的程序(本人比较懒,有时间再写一个计算器)
代码:
widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QGridLayout>
#include <QPushButton>
#include <QLineEdit>
#include <QLabel>
#include <QString>
#include <QDialog>

class Widget : public QWidget   //窗口类,是一个抽象类
{
    Q_OBJECT

public:
    Widget(QWidget *parent = 0);    //纯虚函数
    ~Widget();
private:
    QHBoxLayout *layout1, *layout2;
    QVBoxLayout *layout3;
    QPushButton *but1;
    QLineEdit *edit1, *edit2, *edit3;
    QLabel *label1;

private slots:      //Qt独有的信号和槽
    void on_clicked();
};

#endif // WIDGET_H

widget.cpp

#include "widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    //layout4 = new QGridLayout(this);
    //先添加一个垂直布局,再将两个水平布局覆盖在垂直布局中
    layout3 = new QVBoxLayout(this);//this表示垂直布局所在的窗体
    layout1 = new QHBoxLayout;
    layout2 = new QHBoxLayout;
    layout3->addLayout(layout2);
    layout3->addLayout(layout1);  
    but1 = new QPushButton;
    edit1 = new QLineEdit;
    edit2 = new QLineEdit;
    edit3 = new QLineEdit;
    label1 = new QLabel;
    layout1->addWidget(edit1);
    layout1->addWidget(edit2);
    layout1->addWidget(edit3);
    layout1->addWidget(but1);
    layout2->addWidget(label1);

//    以上是用水平布局和垂直布局写的,用二维布局更简单
//    layout4->addWidget(but1, 0, 0);
//    layout4->addWidget(edit1, 0, 1);
//    layout4->addWidget(edit2, 0, 2);
//    layout4->addWidget(edit3, 1, 0);
//    layout4->addWidget(label1, 1, 1);

    but1->setText("=");

    //当点击了btn1的时候就调用on_clicked()这个函数
    //实现控件与具体的槽函数关联
    connect(but1, SIGNAL(clicked()), this, SLOT(on_clicked()));
}

void Widget::on_clicked()
{
    int a = edit1->text().toInt();  //将输入的内容转化为int类型
    int b = edit3->text().toInt();
    if (edit2->text() == "+")
        label1->setText(QString::number(a + b));
    if (edit2->text() == "-")
        label1->setText(QString::number(a - b));
    if (edit2->text() == "*")
        label1->setText(QString::number(a * b));
    if (edit2->text() == "/")
        if (b != 0)
            label1->setText(QString::number(a / b));
}

Widget::~Widget()
{
    //delete layout1;在QT内部,不需要单独delete一个控件的指针
    //QT的窗口在退出的时候会自动delete他相关的子控件
}

main.cpp

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

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;   
    w.show();

    return a.exec();
}

运行结果:
这里写图片描述

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值