Qt笔记
目录
Qt中添加资源文件(图片等)
1.远中工程右键->添加新文件,弹出下图对话框
2选中Qt->Qt Resoure File,弹出下列对话框
3.取名,下一步,完成,然后会出现如下对话框
4.点击添加,选择添加前缀,添加好前缀之后就可以添加文件了,选择需要添加的文件,这里需要把需要添加的文件先放到项目目录下的一个文件夹下,添加好之后保存,就能在资源浏览器中看到了,也就能在代码中引用了。<图标下载百度icon>
菜单栏和工具栏
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); //添加内容(新建文件)
文件操作(QFileDialog)
(一)打开文件
QSting filename = QFileDialog::getOpenFileName(this,"open file",".","file (*.*)");//获取文件名,2-4个参数分别为:标题,位置,文件类型
QFile file(filename);
if(!file.open(QIODevice::ReadWrite | QIODevice::Text)) //打开文件
{
qDebug()<<"open file failing"<<endl;
return;
}
while(!file.atEnd())
{
QByteArray line = file.readLine();
line.chop(1);
textedit->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();
对话框(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的内容是否满足输入格式
{
}
(二)LineEdit的一些用法
1、ui->lineEdit->setEchoMode(QLineEdit::Password);//将lineEdit输入的内容为隐式
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)));
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<QTableView *> ("qt_calendar_calendarview");
if(table_calendarview)
{
table_calendarview->hideColumn(0); //隐藏掉第0列显示的“一年中的第几周”
}
QToolButton *calendar_prevmonth = m_calendar->findChild<QToolButton *>("qt_calendar_prevmonth");//调日历的左右按钮
QToolButton *calendar_nextmonth = m_calendar->findChild<QToolButton *>("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 <QThread>
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();
*/
}
QProcess
QProcess可用于完成启动外部程序,并与之交互通信。
QProcess *ShotProcess = new QProcess();
ShotProcess->start("路径");
坐标系统
(一)性质:
- 窗口,坐标系统相对于父窗口;
- 原点相对于窗口空白区域左上角(不包括边框);
- X:往右递增,Y:往下递增;
(二)移动坐标
控件->move(100,100);
(三)获取控件的全局坐标
QPoint LinePoint = 控件->mapToGlobal(QPoint(0,0));
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()<<QSqlDatabase::drivers();
- sqlite数据库需要与QSqlQuery类关联使用;
(二) sqlite数据的函数
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); //创建一个QSqlite数据库 db.setHostName("localhost"); //数据库主机名 db.setDatabaseName("scott"); //数据库名 db.setUserName("stott"); //数据库用户名 db.setPassword("tiger"); //数据库密码 db.open(); //打开数据库连接 db.close(); //释放数据库连接
(三)QSqlQuery类
用于处理sqlite的命令
方法一:
QSqlQuery qsQuery = QSqlQuery(db);
qsQuery.exec("sqlite数据库的命令");
方法二:
QSqlQuery qsQuery = QSqlQuery(db);
QString strSqlText = QString("sqlite命令");
qsQuery.prepare(strSqlText);
qsQuery.exec();
QMap
(一)性质
- 键不能重复,重复后一个覆盖前一个;
QMap<qint16,bool> mymap;
mymap.insert(12,false);
mymap.insert(22,false);
mymap.insert(12,false);
mymap.insert(55,false);
mymap.insert(66,false);
QMapIterator<qint16,bool> it(mymap);
while(it.hasNext())
{
it.next();
qDebug()<<"key = "<<it.key()<<"value = "<<it.value()<<endl;
}
qDebug()<<mymap[12]<<endl;
Qt常用函数
1、设置控件大小
void resize(int w, int h); //给控件设置大小
void resize(const QSize &);
2、获取字符串的部门连续字符
QString str1 = str.mid(row,length);//获取str中从第row起连续length个字符
3、添加背景图片
控件->setStyleSheet("background-image: url(:/new/prefix1/image/cut.png);");
3、隐藏控件
方法一:setVisible(false);
方法二:hide();//实质调用setVisible(false)
4、foreach
foreach虽然是for循环的简化版本,但是并不是说foreach就比for更好用,foreach适用于循环次数未知,或者计算循环次数比较麻烦情况下使用效率更高,但是更为复杂的一些循环还是需要用到for循环效率更高。
QStringList slt = {"abc", "qwe", "upo"};
foreach(QString s,slt)
{
cout<<s<<endl;
}
// 输出结果为:abc qwe upo