实例五---绘图,计时器多线程,键盘响应
加法
直接在QT内开发
QString q1,q2,q3;
q1=ui->lineEdit_1->text();
q2=ui->lineEdit_2->text();
int n=q1.toInt()+q2.toInt();
q3=q3.sprintf("%d",n);
ui->lineEidt_3->settext(q3);
动画,绘图(QWidget)
随机产生5个点在屏幕上。
头文件:
#include <QPainter>
#include <cstdlib>
#include <ctime>
struct S
{
int x,y;
}
//在class Widget内添加private S[5]
private:
S ball[5];
void draw();
protected:
void paintEvent(QPaintEvent *event)
.cpp文件:
void Widget::paintEvent(QPaintEvent *event)
{
draw();
}
void Widget::draw()
{
QPainter paint(this);//定义一个画笔对象,先画圈,再填充色
QPen pen(QColor(255,255,255));//定义一个画笔。全满格。红绿蓝是白色
QBrush brush(QColor(255,0,0));//定义一个画刷。
paint.setPen(pen);
paint.setBrush(brush);
int i;
for(i=0;i<5;i++)
{
ball[i].x=rand()%800;
ball[i].y=rand()%600;
paint.drawEllipse(ball[i].x,ball[i].y,20,20);
}
}
void Widget::on_pushButton_clicked()
{
update();
}
计时器,多线程(QWidget)
.h头文件
#include <QObject>//timer
#include <QDebug>//timer
#include <QTimerEvent>//timer
private:
int n;
int t;//timer
protected:
virtual void timerEvent(QTimerEvent* ev);//计时函数
窗口初始化函数和timeEvent()函数
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
n=0;
QString qs;
qs=qs.asprintf("%d",n);
ui->lineEdit->setText(qs);//设置初始0值
}
void Widget::timerEvent(QTimerEvent* ev)//timer
{
if(ev->timerId()==t)//ev->timeId()就是距离上个的时间差
{
++n;
QString qs;
qs=qs.asprintf("%d",n);
ui->lineEdit->setText(qs);
}
}
槽函数
void Widget::on_pushButton_clicked()
{
t=startTimer(1000);//开始计时和停止后继续计时
}
void Widget::on_pushButton_2_clicked()
{
this->killTimer(t);//停止计时
}
void Widget::on_pushButton_3_clicked()
{
n=0;
QString qs;
qs=qs.asprintf("%d",n);
ui->lineEdit->setText(qs);
}
键盘响应(键盘按钮使数字变化)
.h头文件
#include <QKeyEvent>
private:
int n;
protected:
virtual void keyPressEvent(QKeyEvent* ev);//接受按键,变化数字函数
.cpp文件
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
int n=0;
QString s;
s=s.sprintf("%d",n);
ui->lineEdit->setText(s);
}
void Widget::keyPressEvent(QKeyEvent* ev)//接受按键,变化数字函数
{
switch(ev->key())
{
case Qt::Key_Up:n=n-1;break;
case Qt::Key_Down:n=n+1;break;
}
if(n<0)
n=0;
QString qs;
qs=qs.asprintf("%d",n);
ui->lineEdit->setText(qs);
}
多窗口调用
1、在编辑-forms上右击,选择:QT-QT设计师类,选择类别,起个名字,如ldm
可以看到添加了一个dialog_2.ui
2、在原来的.h中包含ldm.h
#include "ldm.h"
3、对类ldm实例化
private:
Ui::basedialog *ui;
ldm* ldm1;
4、cpp
构造函数
{
ui->setupUi(this);
ldm1 = new ldm;
}
5、添加按钮响应函数
void basedialog::on_inputButton_clicked()
{
ldm1->show();
}
列表框和表格框
列表框处理函数
listWidget()->currentRow();
取行号。
ui->listWidget()->addItem(item);//添加item到列表框中
ui->lineEidt()->clear();//清除文本框
int row=ui->listWidget()->currentRow();//范围当前行数,是int型
ui->listWidget()->takeItem(row);//以int型行数作为参数,清除这个元素
ui->listWidget()->item(row)->setText()/->text();//以row行作为参数,取string和设置string。
列表框内容反馈给文本框
itemSelectionChanged()
void Dialog::on_listWidget_itemSelectionChanged()
{
QString s;
int row=ui->listWidget->currentRow();//获取当前行
s=ui->listWidget->item(row)->text();//获取当前行内容
ui->lineEdit->setText(s);
}
表格框
表格框是tablewidget
添加按钮:
void Dialog_2::on_addButton_clicked()
{
QString temp1,temp2;
temp1=ui->lineEdit->text();
temp2=ui->lineEdit_2->text();
int row=ui->tableWidget->rowCount();//获取当前总行数,往后添加。
ui->tableWidget->insertRow(row);//插入新行
ui->tableWidget->setItem(row,0,new QTableWidgetItem(temp1));//第一个参数是行号,第二个参数是列号,第三个参数是*item,需要将temp1转为QTableWidget对象
ui->tableWidget->setItem(row,1,new QTableWidgetItem(temp2));
ui->lineEdit->clear();
ui->lineEdit_2->clear();
}
修改按钮
QString temp1,temp2;
temp1=ui->lineEdit->text();
temp2=ui->lineEdit_2->text();
int row=ui->tableWidget->currentRow();//获得当前选中行
ui->tableWidget->setItem(row,0,new QTableWidgetItem(temp1));
ui->tableWidget->setItem(row,1,new QTableWidgetItem(temp2));
删除按钮
removeRow()删除行
void Dialog_2::on_delButton_clicked()
{
int row=ui->tableWidget->currentRow();//获得行
ui->tableWidget->removeRow(row);//removeRow(row)删除行
}
表格框内容选中反馈给文本框
不同于列表框,获得row之后,通过item(row)
取到内容,这里需要借助行号和列号共同作用取内容:item(row,column)
。
void Dialog_2::on_tableWidget_itemSelectionChanged()
{
int row=ui->tableWidget->currentRow();//取行号
QString s1,s2;
s1=ui->tableWidget->item(row,0)->text();//修改内容
s2=ui->tableWidget->item(row,1)->text();
ui->lineEdit->setText(s1);
ui->lineEdit_2->setText(s2);
}