目录
Qt中添加资源文件(图片等)
信号与曹
菜单栏和工具栏
文件操作(QFileDialog)
QDataStream与QTextStream
对话框(QDialog)
字体颜色和大小
布局
时间
定时器(QTimer)
QLineEdit
(二)QLineEdit的一些用法
QTextEdit
QListwidget
QTableWidget
QAbstractTableModel
QCalendarWidget(日历)
线程(QThread)
QProcess
坐标系统
Qt自定义界面提升
QPushButton
QTabWidget
QSQLITE数据库
QMap
截图实现
事件
画图
QVariant
Movie
QString
背景
Qt常用函数
1.远中工程右键->添加新文件,弹出下图对话框
2选中Qt->Qt Resoure File,弹出下列对话框
3.取名,下一步,完成,然后会出现如下对话框
4.点击添加,选择添加前缀,添加好前缀之后就可以添加文件了,选择需要添加的文件,这里需要把需要添加的文件先放到项目目录下的一个文件夹下,添加好之后保存,就能在资源浏览器中看到了,也就能在代码中引用了。<图标下载百度icon>
一、多个相同部件用同一个曹函数(以QPushButton举例)
connect(ui->pushButton1,SIGNAL(pressed()),this,SLOT(SLOTButtonClick()));
connect(ui->pushButton2,SIGNAL(pressed()),this,SLOT(SLOTButtonClick()));
void Widget::SLOTButtonClick()
{
QPushButton *btn=qobject_cast(sender()); //得到当前操作的按钮
if(btn==ui->pushButton1)
{
//添加响应信息
}
else if(btn == ui->pushButton2)
{
//添加响应信息
}
else
{
}
}
1.示例图
(二)菜单栏
1.在菜单栏添加菜单
QMenu *filemenu = menuBar()->addMenu("&文件"); //添加文件菜单
2.在菜单中添加菜单项
方法一:
QAction *newfile = new QAction("&new");
newfile->setIcon(QIcon(":/image/new.png")); //为文件添加图标
filemenu->addAction(newfile); //菜单下拉组(菜单下添加新文件)
方法二:
QAction *newfil = new QAction(QIcon(":/image/new.png"),"&new",this);
filemenu->addAction(savefile);
connect(newfile,SIGNAL(triggered(bool)),this,SLOT(new_fun())); //新文件信号与槽
3.菜单项中添加分割线
filemenu->addSeparator(); //设置分割线
(三)工具栏
QToolBar *newtool = addToolBar("newtool"); //声明一个工具栏
newtool->addAction(newfile); //添加内容(新建文件)
(一)打开文件
QSting filename = QFileDialog::getOpenFileName(this,"open file",".","file (*.*)");//获取文件名,2-4个参数分别为:标题,位置,文件类型
QFile file(filename);
if(!file.open(QIODevice::ReadWrite | QIODevice::Text)) //打开文件
{
qDebug()<<"open file failing"<append(line); //将文本文件显示在textedit文本框中
}
file.close();
(二)保存文件
if(filename.isEmpty()) //如果文件名为空,就获得文件名(用户取);如果是另存为则不需判断
{
filename = QFileDialog::getSaveFileName();
}
QFile file(filename);
if(!file.open(QIODevice::WriteOnly | QIODevice::Text))
return;
file.write(textedit->toPlainText().toStdString().c_str());//将文本框的内容,导入文件中
file.close();
QDataStream类为我们的程序提供了读写二进制数据的能力。一个数据流如果是二进制编码的数据流,那么它肯定是与计算机的操作系统、CPU或者字节序无关的。例如,一个数据流是在一个运行Windows系统的PC机上被写入的,那么它照样可以
在一台运行Solaris的Sun SPARC的机器上被读取出来。同样,我们也可以使用
QDataStream去读写原生的未编码的二进制数据。
QDataStream类实现了序列化C++的基本数据类型的功能,比如char,short,int,char*,QBrush,QColor,QDateTime,QList,QLinkedList,QVector,QSet,QHash,QMap 和QImage等等。
注意:写入什么类型就读出什么类型。
void Widget::writeData()
{
QFile file("../test.txt");//没有就创建
if(!file.open(QIODevice::WriteOnly))
{
qDebug()<<"---open fial---"< mymap;
mymap.insert(12,false);
mymap.insert(22,false);
mymap.insert(12,false);
mymap.insert(55,false);
mymap.insert(66,false);
stream<>str>>num;
qDebug()<<"str = "<void Widget::writeData()
{
QFile file("../test.txt");
if(!file.open(QIODevice::WriteOnly))
{
qDebug()<<"---open fial---"<>str>>num;//因为两个字符串连在一起了,所以str ="挖机噶234",num = 0
str = stream.readAll();// 一般以read的方式读出
qDebug()<<"str = "<对话框(QDialog)
QDialog *findDlog = new QDialog;
findDlog->setWindowTitle(tr("查找"));
findLineEdit = new QLineEdit(findDlog);
QPushButton *FrontButton = new QPushButton(tr("向下查找"),findDlog);
QPushButton *RearButton = new QPushButton(tr("向上查找"),findDlog);
QVBoxLayout *Layout = new QVBoxLayout(findDlog); //布局
Layout->addWidget(findLineEdit);
Layout->addWidget(FrontButton);
Layout->addWidget(RearButton);
findDlog->setLayout(Layout);
findDlog->show();
示例对话框如下图:
字体颜色和大小
/*颜色*/
QColor color1 = QColorDialog::getColor();
textedit->setTextColor(color1);
/*类型大小*/
bool ok = true;
QFont font1 = QFontDialog::getFont(&ok);
if(ok)
{
textedit->setFont(font1);
}
布局
布局有水平布局(QHBoxLayout)、垂直布局(QVBoxLayout)、网格布局(QGtidLayout)等
/*垂直布局和水平布局一样*/
QPushButton *Button1 = new QPushButton(tr("Yes"),this);
QPushButton *Button2 = new QPushButton(tr("No"),this);
QVBoxLayout *Layout = new QVBoxLayout(this); //布局
Layout->addWidget(Button1 );
Layout->addWidget(Button2 );
this->setLayout(Layout);
/*网格布局*/
QPushButton *Button1 = new QPushButton(tr("Yes"),this);
QPushButton *Button2 = new QPushButton(tr("No"),this);
QGridLayout *Layout = new QGridLayout (this); //布局
Layout->addWidget(Button1,0,1);
Layout->addWidget(Button2,1,0);
this->setLayout(Layout);
时间
1、获取时间与显示时间
QDateTime current = QDateTime::currentDateTime();
QString time = current.toString("yyyy-M-dd hh:mm:ss");//显示时间格式
QString Time = QDate::currentDate().toString("yyyy-MM-dd")+" "+QTime::currentTime().toString("hh:mm:ss");
textedit->append(time); //在文本框中显示
2、判断时间显示格式是否正确,可以用来字符串相关格式
QTime::fromString("04:00","hh:mm").isValid();//反回真假
3、将时间转
定时器(QTimer)
QTimer *timer;
timer = new QTimer();
timer->start(1000);//= timer->setInterval(1000),timer->start();
connect(timer,SIGNAL(timeout()),this,SLOT(time_out()));
timet->stop(); //停止定时器
直接触发定时器
QTimer::singleShot(10,this,SLOT(槽函数));//10ms后触发槽函数(槽函数不能有参数)
QLineEdit
(一)设置LineEdit输入值范围
double m_rangeMin = 12.0;
double m_rangeMax = 99.0;
//设置整数和浮点数的输入范围
QDoubleValidator *doubleValidator = new QDoubleValidator(m_rangeMin,m_rangeMax,1,this);//1是小数位数
//这里作为一个标准的数字的字符串被写入,另外还有一种科学计数方式写入
doubleValidator->setNotation(QDoubleValidator::StandardNotation);
ui->lineEdit->setValidator(doubleValidator);
qint8 m_rangeMin = 14;
qint8 m_rangeMax = 100;
QIntValidator *intValidator = new QIntValidator(m_rangeMin, m_rangeMax, this);
ui->lineEdit->setValidator(intValidator);
if(ui->lineEdit->hasAcceptableInput())//判断lineEdit的内容是否满足输入格式
{
}
(二)QLineEdit的一些用法
1、ui->lineEdit->setEchoMode(QLineEdit::Password);//将lineEdit输入的内容为隐式
QTextEdit
1、禁止鼠标选中文本
ui->textEdit->setTextInteractionFlags(Qt::NoTextInteraction);
QListwidget
1.向列表中添加控件,如下图:
QListWidget *listwidget = new QListWidget();
QListWidgetItem *item = new QListWidgetItem;
item->setSizeHint(QSize(0,50)); //设置项的高框
listwidget->addItem(item); //加载列表项到列表框
QWidget *w = new QWidget;
QHBoxLayout *layout=new QHBoxLayout;
QLabel *label = new QLabel("swich:",w);
QPushButton *pushButton1 = new QPushButton("ON",w);
QPushButton *pushButton2 = new QPushButton("OFF",w);
layout->addWidget(label);
layout->addWidget(pushButton1);
layout->addWidget(pushButton2);
w->setLayout(layout);
listwidget->setItemWidget(item,w);
2.添加列表项,如下图:
listwidget->addItem("北京");
listwidget->addItem("上海");
QListWidgetItem *item = new QListWidgetItem(QICon("test.png"),"深圳");
listwidget->addItem(item);
listwidget->insertItem(1,"深圳");//插入列表
3.删除列表
listwidget->takeItem(row); //删除列表,并没删除只是隐藏了
4.获取哪一页
ListWidget->setCurrentIndex(num);
QTableWidget
ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);//表格不能编辑
ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);//表格每次选择一行
qint8 row = ui->tableWidget->rowCount();//获取行数
ui->tableWidget->setRowCount(row+1);//增加一行
QString ip = "127.0.0.1";
qint8 port = 123;
ui->tableWidget->setItem(row,colum,new QTableWidgetItem(ip));//想表格里添加文本
ui->tableWidget->setItem(row,colum+1,new QTableWidgetItem(QString::number(port)));
QAbstractTableModel
QAbstractTableModel 是 Qt 中的一个抽象类,在某些应用场景下我们可能会继承该类来实现一些特殊业务逻辑。
GridTable.h
#ifndef GRIDTABLE_H
#define GRIDTABLE_H
#include
#include
class GridTable:public QAbstractTableModel
{
public:
GridTable(QObject *parent=0);
virtual int rowCount(const QModelIndex &/*parent=QModelIndex()*/) const;
virtual int columnCount(const QModelIndex &/*parent=QModelIndex()*/) const;
//如果表格可编辑添加下列两个函数
virtual Qt::ItemFlags flags(const QModelIndex &index) const;
virtual bool setData(const QModelIndex &index, const QVariant &value, int role);
QVariant data(const QModelIndex &index, int role) const;
QVariant headerData(int section, Qt::Orientation orientation, int role) const;
void insertInformationRows(const QList &warningInfoList); //插入信息
void removeAllRows(void);//清空内容
private:
QStringList header; //Table表头
QStringList nameList;
QStringList sexList;
QStringList ageList;
QStringList heightList;
};
#endif
GridTable.cpp
#include "gridtable.h"
GridTable::GridTable(QObject *parent) : QAbstractTableModel(parent)
{
header< &InfoList)
{
beginInsertRows(QModelIndex(), 0, InfoList.size()-1);
foreach(QStringList Info, InfoList)
{
nameList.insert(0,(Info.at(0)));
sexList.insert(0,(Info.at(1)));
ageList.insert(0,(Info.at(2)));
heightList.insert(0,(Info.at(3)));
}
endInsertRows();
}
void GridTable::removeAllRows(void)
{
beginRemoveRows(QModelIndex(), 0, nameList.size()-1);
nameList.clear();
sexList.clear();
ageList.clear();
heightList.clear();
endRemoveRows();
}
Qt::ItemFlags GridTable::flags(const QModelIndex &/*index*/) const
{
return Qt::ItemIsEnabled | Qt::ItemIsSelectable|Qt::ItemIsEditable;
}
bool GridTable::setData(const QModelIndex &index, const QVariant &/*value*/, int role)
{
//处理 Qt::EditRole 角色,此时的 value 就是修改后的值
if(index.isValid()&&role==Qt::EditRole){
switch (index.column()) {
case 0:
//
break;
case 1:
//
break;
case 2:
//
break;
case 3:
//
break;
default:
break;
}
}
return true;
}
main.c
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
GridTable SetTable;
ui->TableShow->setModel(&SetTable);
ui->TableShow->horizontalHeader()->resizeSection(0,140); //设置第一列列宽
ui->TableShow->horizontalHeader()->resizeSection(1,140); //设置第二列列宽
ui->TableShow->horizontalHeader()->resizeSection(2,140); //设置第三列列宽
ui->TableShow->horizontalHeader()->resizeSection(3,140); //设置第四列列宽
ui->TableShow->setSelectionBehavior(QAbstractItemView::SelectRows); //一次选择一行
ui->TableShow->setSelectionMode(QAbstractItemView::SingleSelection); //只允许单行选择
ui->TableShow->verticalHeader()->setDefaultSectionSize(40); //调整默认行间距
ui->historywarningtable->verticalHeader()->setMinimumSectionSize(40); //设置最小行间距
ui->TableShow->setStyleSheet("QScrollBar:vertical { width:40px; }");//滑条宽度
//ui->TableShow->horizontalHeader()->setResizeMode(QHeaderView::Fixed); //限定列宽大小,无法拉伸
//ui->TableShow->verticalHeader()->hide(); //隐藏列头
//ui->TableShow->horizontalHeader()->hideSection(5); //隐藏第五列
QList InfoList;
QStringList Info;
Info<<"小明"<<"男"<<"16"<<"162";
InfoList.append(Info);
SetTable.insertInformationRows(InfoList);
return a.exec();
}
QCalendarWidget(日历)
m_calendar = new QCalendarWidget(this);
m_calendar->resize(580, 340); //原始大小 360,210
m_calendar->move(100, 220-(m_calendar->size().height()-210));
QTableView *table_calendarview = m_calendar->findChild ("qt_calendar_calendarview");
if(table_calendarview)
{
table_calendarview->hideColumn(0); //隐藏掉第0列显示的“一年中的第几周”
}
QToolButton *calendar_prevmonth = m_calendar->findChild("qt_calendar_prevmonth");//调日历的左右按钮
QToolButton *calendar_nextmonth = m_calendar->findChild("qt_calendar_nextmonth");
if(calendar_prevmonth && calendar_nextmonth)
{
calendar_prevmonth->setIconSize(QSize(40,40));
calendar_nextmonth->setIconSize(QSize(40,40));
}
m_calendar->setLocale(QLocale::Chinese);//将日历转为中文
线程(QThread)
一、创建线程的步骤
- 新建一个类MyThread,继承QThread(点击工程右键->添加新文件->c++ class->基类设为QObject,建立完成将QObject改为QThread);
- 重写类MyThread的虚函数void run(),即新建一个函数protected void run(),为线程处理函数和主线程不是同一个线程;
- 在需要用到多线程的地方,MyThread *mythread = new MyThread(this),然后调用函数mythread ->start()后,则开启一条线程,将会运行函数run();
- 当要停止线程时,调用mythread ->wait()函数,等待线程结束,并且回收线程资源;
- 线程处理函数内部,不允许操作图形界面(一般只做后台处理);
/***************Mythread.h**************************/
#ifndef MYTHREAD_H
#define MYTHREAD_H
#include
class Mythread : public QThread
{
Q_OBJECT
public:
explicit Mythread(QObject *parent = 0);
protected:
void run(); //QTread的虚函数;
//不能直接调用,通过start()间接调用
signals:
public slots:
};
#endif // MYTHREAD_H
/******************Mythread.cpp*********************************/
#include "mythread.h"
Mythread::Mythread(QObject *parent) : QThread(parent)
{
}
void Mythread::run()
{
/*
1.数据处理
2.emit 处理完可以发射一个信号
3.然后在主线程的槽函数中停止线程:mythread->quit(),
再等待线程结束:mytread->wait();
*/
}
二、线程另一种用法
(一)线程类
1、设定一个类,继承于QObject
2、类中设置一个线程函数(只是一个线程函数)
class Mythread:public QObject
{
void MythreadFun//自定义线程处理函数
{
while(1)
{
emit MySignal();
}
}
}
(二)主窗口
1、构造函数中创建一个线程对象(不能指定父对象)
myT = new Mythread;
2、创建一个子线程对象
QThread *thread = new QThread(this);
3、把自定义模块添加到子线程
myT->movetoThread(thread);
4、启动线程。只是把线程开启了,并没有启动线程处理函数
thread->start();
5、启动线程处理函数,必须通过信号与槽(signal - slot)
connect(this,&startThread,myT,&MythreadFun);
6、接受线程的信号,并处理
connect(myT,&MySignal,this,&槽函数);
QProcess
QProcess可用于完成启动外部程序,并与之交互通信。
QProcess *ShotProcess = new QProcess();
ShotProcess->start("路径");
坐标系统
(一)性质:
- 窗口,坐标系统相对于父窗口;
- 原点相对于窗口空白区域左上角(不包括边框);
- X:往右递增,Y:往下递增;
(二)移动坐标
控件->move(100,100);
(三)获取控件的全局坐标
QPoint LinePoint = 控件->mapToGlobal(QPoint(0,0));
(四)坐标函数
frameGeometry().topLeft() //窗口左上角全局坐标
globalPos(); //全局坐标
Qt自定义界面提升
(一)用法
当需要把一个界面(B),放到另一个界面中(A),则需要用到提升。实质是widget继承B类;
(二)特点
- 界面A不能直接操作界面B的控件,必须调用A类的函数来间接操作;
- 界面A中需要拖动一个widget控件,然后将其提升(点击右键->提升为...->提升类的名称:B类的名称->提升),实质是widget继承B类;
QPushButton
(一)点击信号
- pressed --- pressed按下就触发;
- clicked --- clicked按下再弹起才触发;
- toggled --- 这个信号触发的前提是按钮的Checkable属性要设置成true,这样在点击按钮之后就会触发toggled信号;当调用setChecked()函数时,会自动运行槽函数;
- 三个触发先后顺序:toggled 、pressed 、clicked ;
(二)将按钮设为凹陷形式
方法一:需要将按钮Checkable属性要设置成true,setChecked(true)---凹陷形式;
方法二:直接setdown(true),但点击其他地方有恢复,目前我还没找到方法;
(三)将按钮Checkable属性要设置成true时,有两种状态Checked(ture)<按钮凹陷形式>和Checked(false),点击按钮两种状态相互切换;
(三)添加背景图片
ui->pushButton->setStyleSheet("background-image: url(:/new/prefix1/image/cut.png);");
QTabWidget
(一)删除页(实质是隐藏)
ui->tabWidget->removeTab(2);//删除第二页
ui->tabWidget->addTab(ui->tab_2,QObject::tr("方法"));//删除后又让其显示
(二)插入页
ui->tabWidget->addTab();
QSQLITE数据库
(一)使用方法
- 在.pro文件添加:QT += core gui spl
- dayinQT支持的数据库驱动:qDebug()<
- sqlite数据库需要与QSqlQuery类关联使用;
(二) sqlite数据的函数
QSqlDatabase database = QSqlDatabase::addDatabase("QSQLITE"); //创建一个QSqlite数据库
database.setHostName("localhost"); //数据库主机名
database.setDatabaseName("scott"); //数据库名
database.setUserName("stott"); //数据库用户名
database.setPassword("tiger"); //数据库密码
database.open(); //打开数据库连接
database.close(); //释放数据库连接
(三)QSqlQuery类
用于处理sqlite的命令
方法一:
QSqlQuery qsQuery = QSqlQuery(database);
qsQuery.exec("sqlite数据库的命令");
方法二:
QSqlQuery qsQuery = QSqlQuery(database);
QString strSqlText = QString("sqlite命令");
qsQuery.prepare(strSqlText);
qsQuery.exec();
示例:
//设置数据库驱动名称
QSqlDatabase database = QSqlDatabase::addDatabase("QSQLITE"); //创建一个QSqlite数据库
/*一般这样用
if(database.contains("数据库名"))
database = QSqlDatabase::database("数据库名");
else
database = QSqlDatabase::addDatabase("QSQLITE" , "数据库名");
*/
//设置数据库名
database.setDatabaseName("../test.db");
if(database.open())
{
qDebug()<<"dadabase open success"<QSqlDatabase database = QSqlDatabase::addDatabase("QSQLITE"); //创建一个QSqlite数据库
//设置数据库名
database.setDatabaseName("../test.db");
QString cmd = QString("SELECT COUNT(*) FROM sqlite_master WHERE type='table' AND name='%1'").arg("表名");
SQLBase db = SQLBase(cmd);
QSqlQuery query(database);
query.prepare(cmd);
if(query.first())
{
bool isHaveTable = query.value(0).toBool();//含有某个表返回ture
if(isHaveTable == true)
{
}
}
QMap
(一)性质
1、键不能重复,重复后一个覆盖前一个;
QMap mymap;
mymap.insert(12,false);
mymap.insert(22,false);
mymap.insert(12,false);
mymap.insert(55,false);
mymap.insert(66,false);
QMapIterator it(mymap);
while(it.hasNext())
{
it.next();
qDebug()<<"key = "<
(二)用法
1、简单用法
QMapInfo;
Info.insert(100,"xiaoming");
Info.insert(87,"xiaohong");
Info.insert(99,"shax");
QString name1 = Info.value(100,NULL);
QString name2 = Info.value(87,NULL);
qDebug()<<"name1 = "<
常用于QMap Info;和上诉一样。
截图实现
QPixmap::grabWindow(WinId); //获取图片
QDesktopWidget //获取当前程序所在窗口的Id
winId()
#include
#include
#include
#include
#include
QPixmap pixmap = QPixmap::grabWindow(QApplication::desktop()->window()->winId());//获取桌面图片
ui->ScreenLabel->setPixmap(pixmap.scaled(ui->ScreenLabel->size()));//将图片显示在label中并按比例缩放
QString fileName = QFileDialog::getSaveFileName(this,"Save file",".");//保存图片
pixmap.save(fileName);
QClipboard *clipboard = QGuiApplication::clipboard();//创建剪切板
//QString originalText = clipboard->text();
clipboard->setPixmap(this->pixmap);//将图片放在剪切板上,可以直接粘贴
事件
所有的事件都是受保护的成员函数。
一、显示鼠标右键光标位置事件
#include
void contextMenuEvent(QContextMenuEvent *event)//在函数中实现内容
{
对话框->exec(QCursor::pos());//显示在光标位置
}
二、关闭事件-closeEvent()
#include
void MainWindow::closeEvent(QCloseEvent *event)
{
if()
{
event->accept();//接受事件
}
else
{
event->ignore();//忽略事件
}
}
三、鼠标事件
(一)鼠标按下-mousePressEvent()
void Widget::mousePressEvent(QMouseEvent *event)
{
if(event->button() == Qt::LeftButton)
{
QPoint p = event->globalPos() - this->frameGeometry().topLeft();
}
else if(event->button() == Qt::RightButton)
{
this->close();
}
else
{}
Widget::mousePressEvent(event);//信号继续往下传(传给Widget)
}
(二)鼠标移动-mouseMoveEvent()
void Widget::mouseMoveEvent(QMouseEvent *event)
{
move(event->globalPos());
}
(三)鼠标释放-mouseReleaseEvent()
void Widget::mouseReleaseEvent(QMouseEvent *event)
{
if(event->button() == Qt::LeftButton)
{
}
else if(event->button() == Qt::RightButton)
{
}
else
{}
}
示例:
/*移动对话框*/
void Widget::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton)
{
firstPoint = QCursor::pos() - frameGeometry().topLeft();
}
}
void Widget::mouseMoveEvent(QMouseEvent *event)
{
if (event->buttons() & Qt::LeftButton)
{
QPoint curPoint = event->globalPos() - firstPoint;
move(curPoint);
}
}
四 、键盘事件
(一)键盘按下-keyPressEvent()
void Widget::keyPressEvent(QKeyEvent *event)
{
if(event->key() == Qt::Key_A)
{
}
}
五、其他事件
(一)、resizeEvent()
resizeEvent()事件触发:
- resize调用或者其他导致窗口事件大小发生变化产生。
- 如果想拖动主窗口的时候,能够让窗口中的组件随着窗口也能缩放的话,需要重写resizeEvent,原因在于,在构造之后,子窗口的大小就是固定的。
画图
(一)画图事件
- 函数:void paintEvent(QPaintEvent *event);
- 如果在主窗口绘图。必须放在绘图事件里;
- 如果需要重绘图,一定要在 paintEvent()中绘图;
- 绘图事件内部自动调用,窗口需要重绘的时候(状态改变)--调用update()就间接调用了画图事件;
画图事件触发原因:
- 窗口显隐导致重画
- 窗口大小(重新调整)改变,或者重新排布(布局)导致重画
- 调用update 或者 repaint重画
- 当窗口第一次显示时,系统会自动产生绘图事件
- 当窗口部件被其他部件遮挡时,然后又再次显示出来,会对隐藏区域进行重绘事件
void Widget::paintEvent(QPaintEvent *event)
{
QPainter p(this);//创建画家对象
/*QPainter p;
p.begin(this);
//绘图操作
p.end();*/
//设置背景图
// p.drawPixmap(0,0,this->width(),this->height(),QPixmap("../IMG"));//1
//p.drawPixmap(rect(),QPixmap("../IMG"));//2
//定义画笔
QPen pen;
pen.setWidth(5);//设置线宽
//pen.setColor(Qt::red);//设置颜色
pen.setColor(QColor(12,23,56));//rgb设置颜色
//把画笔交给画家
p.setPen(pen);
//画直线
p.drawLine(50,50,50,150);
//创建画刷对象
QBrush brush;
brush.setColor(Qt::red);//设置颜色
brush.setStyle(Qt::Dense1Pattern);//设置样式
//把画刷交给画家
p.setBrush(brush);
//画矩形
p.drawRect(50,150,50,50);
//画圆形
p.drawEllipse(QPoint(150,150),60,70);
//图片 方法一
p.drawPixmap(0,0,QPixmap("../IMG.png");
p.drawPixmap(0,100,QBitmap("../IMG.png"));//QBitmap只有黑白两种颜色
//图片 方法二
QPixmap pixmap;
pixmap.load("../IMG.png");
p.drawPixmap(0,200,pixmap);
}
(二)绘图设备
- QPixmap:针对屏幕进行优化,和平台有关(显示的效果不一样),不能对图片进行修改;
- QImage:和平台无关,可以对图片进行修改,可以在线程中绘图;
- QPicture:保存绘图的状态(二进制文件);
//绘图设备 400*300
QPixmap pixmap(400,300);
QPainter p(&pixmap);
//填充白色背景色
p.fillRect(0,0,400,300,QBrush(Qt::white));
//pixmap.fill(Qt::white);
p.drawLine(20,20,50,60);
//保存图片
pixmap.save("../pixmap.png");
QPicture pic;
QPainter p(&pic);
p.drawRect(40,40,60,60);
//保存的是二进制文件
pic.save("../pic.png");
(三)画曲线
曲线实质是很多条直线组合而成。
QPainter p(this);//创建画家对象
QPen pen;//定义画笔
pen.setWidth(5);//设置线宽
pen.setColor(Qt::red);//设置颜色
p.setPen(pen);//把画笔交给画家
//方法一
QPoint a(20,30);
QPoint b(150,150);
QPoint c(80,20);
QVector v;
v.append(a);
v.append(b);
v.append(c);
QPolygon polyline(v);
p.drawPolyline(polyline);
//方法二
QPoint a(20,30);
QPoint b(150,150);
QPoint c(80,20);
QPolygon polyline(3);
polyline[0] = a;
polyline[1] = b;
polyline[2] = c;
p.drawPolyline(polyline);
QVariant
一、简述
QVariant 可以保存很多Qt的数据类型,包括QBrush、QColor、QCursor、QDateTime、QFont、QKeySequence、 QPalette、QPen、QPixmap、QPoint、QRect、QRegion、QSize和QString,并且还有C++基本类型,如 int、float等。到需要使用的时候使用一系列的to函数取出来即可,注意:对于存入的是什么类型,取出也要为这个类型。
QVariant也可以支持自定义的数据类型。被QVariant存储的数据类型需要有一个默认的构造函数和一个拷贝构造函数。为了实现这个功能,首先必须使用Q_DECLARE_METATYPE()宏。通常会将这个宏放在类的声明所在头文件的下面:
二、简单例子实现
存储用到了QVariant QVariant::fromValue(const T &value) 或 void QVariant::setValue(const T &value)。获取用到了 T QVariant::value() const 或 to函数,在这之前一般要bool QVariant::canConvert(int targetTypeId) const先用进行判断,是否可以转换。
QVariant v1(520);
int num1 = v1.toInt();
QVariant v2 = 520;
int num2 = v2.toInt();
QVariant v3;
v3.setValue(5);
int num3 = v3.toInt(); // num3 = 5
QString str3 = v3.toString(); // str3 = "5"
QVariant v4;
v4.fromValue(5);
int num4 = v4.toInt(); //num4 =5
QString str4 = v4.toString(); //str4 = ""
QVariant v5;
v5.setValue(250);
int num5 = v5.value(); //num5 = 250
QString str5 = v5.value(); //str5 = "250";
三、自定义存储QVariant类型
QVariant也可以支持自定义的数据类型。被QVariant存储的数据类型需要有一个默认的构造函数和一个拷贝构造函数。为了实现这个功能,首先必须使用Q_DECLARE_METATYPE()宏。通常会将这个宏放在类的声明所在头文件的下面。
struct Student{
QString name;
int age;
int score;
};
Q_DECLARE_METATYPE(Student)
//存储数据
Student stu;
stu.name = "xiaoming";
stu.age = 18;
stu.score = 98;
QVariant v6 = QVariant::fromValue(stu);
//获取数据
Student stu1 = v6.value();
Movie
一、QMovie实现简单的.gif动态图显示
#include
int main(int argc,char *argv[])
{
QApplication app(argc,argv);
QLabel *label = new QLabel();
//方法一
/*
QMovie *movie = new QMovie("../Photograph/tt.gif");
label->setMovie(movie);
*/
//方法二
QMovie *movie = new QMovie(this);
Movie->setFileName("../Photograph/tt.gif");
label->setMovie(Movie);
Movie->setScaledSize(label->size());//图片大小为label大小
Movie->setSpeed(200);//播放速度
movie->start();
label->show();
return app.exec();
}
二、手动打开.gif
#define MAINWINDOW_H
#include
#include
#include
#include
#include
#include
#include
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void on_pushButton_2_clicked();
void on_pushButton_3_clicked();
void on_pushButton_clicked();
private:
Ui::MainWindow *ui;
QMovie *Movie;
};
#endif // MAINWINDOW_H
/*************************************/
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
Movie = new QMovie(this);
Movie->setScaledSize(ui->label->size());//图片大小为label尺寸
Movie->setSpeed(200);//设置播放速度
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_2_clicked()
{
Movie->start();
}
void MainWindow::on_pushButton_3_clicked()
{
Movie->stop();
}
void MainWindow::on_pushButton_clicked()
{
QString filename = QFileDialog::getOpenFileName(this,"open file","../","file (*.gif*)");//获取文件名,2-4个参数分别为:标题,位置,文件类型
if(!filename.isEmpty())
{
if(Movie->isValid())
{
Movie->stop();
}
Movie->setFileName(filename);
ui->label->setMovie(Movie);
Movie->start();
return;
}
}
QString
1 、获取str中从第row起连续length个字符
QString str1 = str.mid(row,length);
2 、组合字符串
QString cureTime = QString("%1%2%3").arg(timeHours).arg(":").arg(timeMinutes);
3 、数转字符串
QString str1 = QString::number(num,'f',2);//将浮点型转化为字符串,2为精度
QString str2 = QString::number(num,10); //将整数转化为字符串,10为十进制
QString str3 = QString("%1").arg(num, 8, 16, QLatin1Char('0')); //8代表宽度,16表示16进制,空位补零
4、分开字符
QStringList MyList = str.split("~");//将字符串以“~”分开
5 、填补字符
QString s = "apple";
QString t = s.leftJustified(8, '.'); // t == "apple..."
QString s = "apple";
QString t = s.rightJustified(8, '.'); // t == "...apple"
QString str = "Pineapple";
str = str.leftJustified(5, '.', true); // str == "Pinea"
6 、删除字符串中某个字符
QString s = "Montreal";
s.remove(1, 4);// s == "Meal"
QString t = "Ali Baba";
t.remove(QChar('a'), Qt::CaseInsensitive);// t == "li Bb"
7、SString类型转换为const char* (toLatin1)
Qstring str = "helloworld";
char *s;
QByteArray ba = str.toLatin1();
s = ba.data();
背景
1、设置背景图片
控件->setStyleSheet("background-image: url(:/new/prefix1/image/cut.png);");
background-image: url(:/new/prefix1/ICO/check_adjust.png);
background-position:center;//图片居中
background-repeat:no-repeat;//图片没有重复
background-color: #B9F8F8;//背景颜色
background-color:transparent;//继承父窗口的背景色
2 、背景渐变色
if(num > 100)
{
num = 100;
}
qreal realValue = num/100.0;
if(realValue == 1)
{
realValue = 0.999;
}
QString qss = QString("QPushButton{border-radius: 0; background: qlineargradient(x1:0,y1:0,x2:1,y2:0,\
stop:0 #15CED0,stop:%1 #15CED0,stop:%2 #B9F8F8,stop:1 #B9F8F8);}")
.arg(realValue).arg(realValue+0.0001);
ui->teButton->setStyleSheet(qss);
3 、样式表
ui->label->setStyleSheet("QLabel{color:rgb(0,255,255);background-color:red; border-image:url(:/new/image/picture.jpg)}");
Qt常用函数
1、设置控件大小
void resize(int w, int h); //给控件设置大小
void resize(const QSize &);
2、控件
方法一:setVisible(false);
方法二:hide();//实质调用setVisible(false)
3、foreach
foreach虽然是for循环的简化版本,但是并不是说foreach就比for更好用,foreach适用于循环次数未知,或者计算循环次数比较麻烦情况下使用效率更高,但是更为复杂的一些循环还是需要用到for循环效率更高。
QStringList slt = {"abc", "qwe", "upo"};
foreach(QString s,slt)
{
cout<
4、Q_UNUSED
Q_UNUSED()消除未用变量警告
int ret;
Q_UNUSED(ret) //消除未用变量警告(如果ret在函数中未使用将会报警)
你可能感兴趣的:(笔记)