注:qt生成有界面的.ui,.cpp,.h文件:右键Add New–>Qt–>Qt设计师界面类–>widget
实现:
1.输入两个数字,按“=”按钮显示计算结果
2.两个操作数必须都是合法的数字,拒绝接收任何非法字符
3.两个操作数必须全部合法,“=”按钮才被激活,否则禁用(不可以点击)
4.显示结果的控件只可查看不可修改,但支持复制到剪贴板
5.所有子窗口的大小和位置随主窗口的缩放自动调整至最佳
calculate.h代码:
#ifndef CALCULATE_H
#define CALCULATE_H
#include <QDialog>
#include<QLabel>
#include<QPushButton>
#include<QLineEdit> //行编辑控件
#include<QHBoxLayout> //水平布局器
#include<QDoubleValidator>//验证器
class Calculate:public QDialog{
Q_OBJECT //moc
public:
Calculate(void);
public slots:
//使能等号按钮的槽函数
void enableButton(void);
//计算结果和显示的槽函数
void calcClicked(void);
private:
QLineEdit* m_editX;//左操作数
QLineEdit* m_editY;//右操作数
QLineEdit* m_editZ;//显示结果
QLabel* m_label; //"+"
QPushButton* m_button;//"="
};
#endif // CALCULATE_H
calculate.cpp代码:
#include "calculate.h"
//构造函数
Calculate::Calculate(void)
{
//界面初始化
//setWindowTitle("计算器");// 设置窗口标题
m_editX=new QLineEdit(this); //this即为父窗口指针
//设置文本对齐:右对齐
m_editX->setAlignment(Qt::AlignRight);
//设置数字验证器,只能输入数字形式内容
m_editX->setValidator(new QDoubleValidator(this));
m_editY=new QLineEdit(this);
m_editY->setAlignment(Qt::AlignRight);
m_editY->setValidator(new QDoubleValidator(this));
m_editZ=new QLineEdit(this);
m_editZ->setAlignment(Qt::AlignRight);
m_editZ->setReadOnly(true);//设置结果只读
//"+"
m_label=new QLabel("+",this);
//"="
m_button=new QPushButton("=",this);
m_button->setEnabled(false); //设置禁用
//创建布局器:自动调用每个控件的大小和位置
QHBoxLayout* layout = new QHBoxLayout(this);
//按水平方向 一次将控件添加到布局器中
layout->addWidget(m_editX);
layout->addWidget(m_label);
layout->addWidget(m_editY);
layout->addWidget(m_button);
layout->addWidget(m_editZ);
//设置布局器
setLayout(layout);
//信号与槽函数连接
//左右操作数文本改变时,发送信号textChanged()
connect(m_editX,SIGNAL(textChanged(QString)),this,SLOT(enableButton(void)));
connect(m_editY,SIGNAL(textChanged(QString)),this,SLOT(enableButton(void)));
//点击按钮 发送信号clicked
connect(m_button,SIGNAL(clicked(void)),this,SLOT(calcClicked(void)));
}
void Calculate::enableButton(void)
{
bool bXOK,bYOK;
//text():获取输入文本(QString)
//toDouble():QString 转换为double,参数保存转换是否成功结果
m_editX->text().toDouble(&bXOK);
m_editY->text().toDouble(&bYOK);
//当左右操作数都输入了有效数据 则使能等号按钮 否则设置禁用
m_button->setEnabled(bXOK && bYOK);
}
void Calculate::calcClicked(void)
{
double res=m_editX->text().toDouble()+
m_editY->text().toDouble();
//number():将double转换成QString
QString str=QString::number(res);
//显示字符串形式结果
m_editZ->setText(str);
}
main.cpp代码:
#include "calculate.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Calculate calc;
calc.show();
return a.exec();
}
结果:
案例2:获取系统时间
1.使用面向对象的Qt编程技术创建获取时间窗口
2.点击按钮 通过自定义的槽函数获取时间并显示到标签
time.h代码:
#ifndef TIME_H
#define TIME_H
#include<QDialog>
#include<QLabel>
#include<QPushButton>
#include<QVBoxLayout> //垂直布局器
#include<QTime> //时间
#include<QDebug>//打印调试
class Time:public QDialog
{
Q_OBJECT;
public:
//构造函数
Time(void);
public slots:
//获取系统时间的槽函数
void getTime(void);
private:
QLabel* m_label; //显示时间label
QPushButton* m_button; //获取时间button
};
#endif // TIME_H
time.cpp代码:
#include "Time.h"
#include <QFont>
Time::Time(void)
{
//初始化界面
m_label=new QLabel(this);
//设置label边框消息:凹陷面板
m_label->setFrameStyle(QFrame::Panel | QFrame::Sunken);
//设置label文本对齐方式:水平/垂直居中
m_label->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
//设置label字体大小
QFont font;
font.setPointSize(20);
m_label->setFont(font);
//获取系统时间的按钮
m_button=new QPushButton("获取当前时间",this);
m_button->setFont(font);
//创建垂直布局器
QVBoxLayout* layout=new QVBoxLayout(this);
layout->addWidget(m_label);
layout->addWidget(m_button);
//设置布局器
setLayout(layout);
//信号与槽函数连接
connect(m_button,SIGNAL(clicked()),this,SLOT(getTime(void)));
}
void Time::getTime(void)
{
qDebug("getTime");
qDebug()<<"getTime";
//获取当前系统时间
QTime time=QTime::currentTime();
//将时间对象转换为字符串
QString str=time.toString("hh:mm:ss");
//显示时间
m_label->setText(str);
}
main.cpp代码:
#include "Time.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Time time;
time.show();
return a.exec();
}