欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Qt笔记

程序员文章站 2024-01-03 11:07:28
...

 

目录

Qt中添加资源文件(图片等)

菜单栏和工具栏

文件操作(QFileDialog)

对话框(QDialog)

字体颜色和大小

布局

时间

定时器(QTimer)

QLineEdit

QListwidget

QTableWidget

QCalendarWidget(日历) 

线程(QThread)

QProcess

坐标系统

Qt自定义界面提升

QPushButton

QTabWidget

QSQLITE数据库 

QMap

Qt常用函数


Qt中添加资源文件(图片等)

1.远中工程右键->添加新文件,弹出下图对话框

Qt笔记

2选中Qt->Qt Resoure File,弹出下列对话框

Qt笔记

3.取名,下一步,完成,然后会出现如下对话框

Qt笔记

 4.点击添加,选择添加前缀,添加好前缀之后就可以添加文件了,选择需要添加的文件,这里需要把需要添加的文件先放到项目目录下的一个文件夹下,添加好之后保存,就能在资源浏览器中看到了,也就能在代码中引用了。<图标下载百度icon>

Qt笔记

菜单栏和工具栏

1.示例图

Qt笔记

(二)菜单栏

   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();

   示例对话框如下图:

Qt笔记

字体颜色和大小

/*颜色*/
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.向列表中添加控件,如下图:

Qt笔记

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)

一、创建线程的步骤

  1. 新建一个类MyThread,继承QThread(点击工程右键->添加新文件->c++ class->基类设为QObject,建立完成将QObject改为QThread);
  2. 重写类MyThread的虚函数void run(),即新建一个函数protected void run(),为线程处理函数和主线程不是同一个线程;
  3. 在需要用到多线程的地方,MyThread *mythread = new MyThread(this),然后调用函数mythread ->start()后,则开启一条线程,将会运行函数run();
  4. 当要停止线程时,调用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("路径");

坐标系统

(一)性质:

  1. 窗口,坐标系统相对于父窗口;
  2. 原点相对于窗口空白区域左上角(不包括边框);
  3. X:往右递增,Y:往下递增;

(二)移动坐标

控件->move(100,100);

  (三)获取控件的全局坐标 

QPoint LinePoint = 控件->mapToGlobal(QPoint(0,0));

Qt自定义界面提升

(一)用法

      当需要把一个界面(B),放到另一个界面中(A),则需要用到提升。实质是widget继承B类;

(二)特点

  1. 界面A不能直接操作界面B的控件,必须调用A类的函数来间接操作;
  2. 界面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

Qt笔记

(一)删除页(实质是隐藏) 

ui->tabWidget->removeTab(2);//删除第二页
ui->tabWidget->addTab(ui->tab_2,QObject::tr("方法"));//删除后又让其显示

(二)插入页

ui->tabWidget->addTab();

QSQLITE数据库 

   (一)使用方法

  1. 在.pro文件添加:QT += core gui spl
  2. dayinQT支持的数据库驱动:qDebug()<<QSqlDatabase::drivers();
  3. 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

(一)性质

  1. 键不能重复,重复后一个覆盖前一个;
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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

上一篇:

下一篇: