目录
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();
}
运行结果: