QT提供的默认基类只有QMainWindow、QWidget和QDialog这三基类,QMainWindow是带有菜单栏和工具栏的主窗口类;QDialog是各种对话框的基类;所有的窗口部件都继承自QWidget。
一、字符串的输入与输出
qt界面设计最常用的字符串输入输出组件为QLable和QLineEdit,QLable用来显示字符串,QLineEdit用来显示和输入字符串。
1、读取和设置显示文字的格式。
QString text() const
void setText(const QString &)
2、普通数值与字符串之间的转换
点击按钮计算,获取输入的数量和单价,相乘计算后将结果显示到文本框里。
槽函数设计:
void Widget::on_btnCal_clicked()
{ //计算 按键单击响应
int num=ui->editNum->text().toInt(); //读取字符串为整数 editNum为组件名
float price=ui->editPrice->text().toFloat();//读取字符串为浮点数 editPrice为组件名
float total=num*price;//相乘计算
QString str;
// str=str.setNum(total,'f',2); //浮点数2位小数
str=str.sprintf("%.2f",total); //格式化输出浮点数
ui->editTotal->setText(str);//在文本框里显示 editTotal为组件名
}
(1)QString类从字符串转换为整数的函数有:以下函数参数缺省时表示把字符串转为整数类型
int toInt(bool * ok= Q_NULLPTR,int base =10 ) const
long toLong(bool * ok= Q_NULLPTR,int base =10 ) const
short toShort(bool * ok= Q_NULLPTR,int base =10 ) const
uint toUInt(bool * ok= Q_NULLPTR,int base =10 ) const
ulong toUlong(bool * ok= Q_NULLPTR,int base =10 ) const
QString类从字符串转换为浮点数的函数
double toDouble(bool * ok= Q_NULLPTR,int base =10 ) const
float toFloat(bool * ok= Q_NULLPTR,int base =10 ) const
(2)进制之间的转换
将一个整数转换为不同进制的字符串,主要使用Qstring类的setNum()或 number()
Qstring &setNum(int n,int base =10)
Qstring number(int n,int base =10)
n是待转换的整数,base是使用的进制,可以指定为十六进制或二进制。
//读取十进制数,转换为16进制
int val=ui->editDec->text().toInt();//读取十进制数
QString str=QString::number(val,16);// 显示为16进制的字符串
// str=str.setNum(val,16);//16进制
//读取二进制数,转换为10进制的数
bool ok;
int val=ui->editBin->text().toInt(&ok,2);//以二进制数读
// str=str.setNum(val,2);//显示为2进制字符串
QString str=QString::number(val,10);//数字显示为10进制字符串
//读取16进制数,转换为10进制的数
bool ok;
int val=ui->editHex->text().toInt(&ok,16);//以十六进制数读入
QString str=QString::number(val,10);// 显示为10进制字符串
// str=str.setNum(val,10);//显示为10进制字符串
二、定时器的使用
Qt中的定时器类时QTimer,不是一个可见的界面组件,在UI设计器的组件面板中里没有。
使用步骤
(1)窗口类中添加定义
class Dialog : public QDialog
{
Q_OBJECT
private:
QTimer *fTimer; //定时器
QTime fTimeCounter;//计时器
private slots:
void on_timer_timeout(); //定时器中断处理槽函数,手工定义
void on_btnSetIntv_clicked(); //设置周期 按键
void on_btnStart_clicked(); //开始 定时器 按键
void on_btnStop_clicked(); //停止定时器按键
}
(2)窗体类构造函数创建定时器,并进行信号与槽的关联
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
fTimer=new QTimer(this); //创建定时器
fTimer->stop();
fTimer->setInterval(1000);//设置定时周期,单位:毫秒
connect(fTimer,SIGNAL(timeout()),this,SLOT(on_timer_timeout())); //关联定时器的信号与槽
}
void Dialog::on_timer_timeout()
{ //定时器中断响应槽函数
QTime curTime=QTime::currentTime(); //获取当前时间
ui->LCDHour->display(curTime.hour()); //显示 小时
ui->LCDMin->display(curTime.minute());//显示 分钟
ui->LCDSec->display(curTime.second());//显示 秒
int va=ui->progressBar->value(); //读取progressBar的数值
va++;
if (va>100)
va=0;
ui->progressBar->setValue(va); //设置progressBar的数值
}
void Dialog::on_btnSetIntv_clicked()
{ //设置定时器周期
fTimer->setInterval(ui->spinBoxIntv->value()); //设置定时器的周期
}
void Dialog::on_btnStart_clicked()
{
fTimer->start();//定时器开始工作
fTimeCounter.start();//计时器开始工作
//更新各按键的状态
ui->btnStart->setEnabled(false);
ui->btnStop->setEnabled(true);
ui->btnSetIntv->setEnabled(false);
}
void Dialog::on_btnStop_clicked()
{
fTimer->stop(); //定时器停止
int tmMsec=fTimeCounter.elapsed();//毫秒数
int ms=tmMsec%1000; //余数毫秒
int sec=tmMsec/1000; //整秒
QString str=QString::asprintf("流逝时间:%d 秒,%d 毫秒",sec,ms);
ui->LabElapsTime->setText(str); //显示流逝的时间
ui->btnStart->setEnabled(true); //更新按键状态
ui->btnStop->setEnabled(false);
ui->btnSetIntv->setEnabled(true);
}
三、QComboBox下拉列表框组件的使用
可以提供一个下拉列表供用户选择,也可以直接当做一个QLineEdit用作输入。
使用方法:
(1)拖一个QComboBox组件到设计窗口
双击组件,可以为其添加选项
(2)用代码添加简单项
以下有两种方法添加到下拉框的选项中
void Widget::on_btnIniItems_clicked()
{ //"初始化列表"按键
QIcon icon;
icon.addFile(":/images/icons/aim.ico");
ui->comboBox->clear(); //清除列表
for (int i=0;i<20;i++)
ui->comboBox->addItem(icon,QString::asprintf("Item %d",i)); //添加一个字符串
// ui->comboBox->addItem(QString::asprintf("Item %d",i)); //添加一个字符串
// QStringList strList;
// strList<<"北京"<<"上海"<<"天津"<<"河北省"<<"山东省"<<"山西省";
// ui->comboBox->addItems(strList);
}
(3)添加具有用户数据的项
void Widget::on_btnIni2_clicked()
{//初始化具有自定义数据的comboBox
//QMap自动根据 key排序
QMap City_Zone;
City_Zone.insert("北京",10);
City_Zone.insert("上海",21);
City_Zone.insert("天津",22);
City_Zone.insert("大连",411);
City_Zone.insert("锦州",416);
City_Zone.insert("徐州",516);
City_Zone.insert("福州",591);
City_Zone.insert("青岛",532);
ui->comboBox2->clear();
////使用迭代器
// QMapIterator item(City_Zone);
// while (item.hasNext()) {
// item.next();
// ui->comboBox2->addItem(item.key(),
// QVariant::fromValue(item.value()));
// }
foreach(const QString &str,City_Zone.keys())
ui->comboBox2->addItem(str,City_Zone.value(str));
}
(4) QComboBox列表项的访问
当QComboBox组件添加多个下拉选项的内容之后,如何得到用户选择的下拉序号或者选择的内容。
访问项的一些函数:
在一个QComboBox组件上选择项发生改变时,会发射如下两个信号
void currentIndexChanged(int index) //传递当前索引号
void currentIndexChanged(const QString &text) //传递当前文字