Qt学习 - 总

Qt学习

      • 学习中的错误
      • 常用快捷键
      • 杂项
      • 布局
      • 信号与槽
      • 数据库相关
      • QSS
        • 选择器 {property:value}
        • Qt样式表设置函数 setStyleSheet()
        • QSS文本属性
      • 事件
        • QMouseEvent:鼠标事件
        • 键盘事件
        • QWheelEvent:滚轮事件
        • QCloseEvent:关闭事件
        • QTimerEvent:超时事件
        • QEvent 中:事件过滤器
        • QPaintEvent:绘图事件
      • QThread:线程
      • 线程通信 -- QMutex:互斥锁
      • 线程通信 -- QSemaphore:信号量
      • 网络相关
        • QUdpSocket:UDP套接字
        • QTcpSocket:tcp通信套接字
        • QTcpServer:tcp连接套接字
      • QPixmap
      • QFile:文件相关
      • QFileInfo:文件信息
      • QDir:目录相关
      • QWidget 相关
        • QWidget
        • QPushButton: 按钮
        • QLineEdit: 行编辑器
        • QCheckBox: 复选框
        • QRadioButton: 单选按钮
        • QGroupBox: 分组框
        • QLabel: 标签
        • QFileDialog: 文件对话框
        • QInputDialog 输入对话框
        • QMessageBox 消息框
        • QFontDialog 字体对话框
        • QColorDialog 颜色对话框
        • 自定义对话框 class myDialog : public QDialog
        • QTextEdit:文本编辑器
        • QListWidget:列表部件
        • QComboBox:下拉条(下拉列表框、组合框)
        • QStackedWidget:堆叠窗口
        • QSpinBox:自旋框(整数)
        • QDoubleSpinBox:数字设定框(浮点数)
        • QSlider:滑动条
        • QScrollBar:滚动条
        • QProgressBar:进度条
        • QTime:时间
        • QTimeEdit:时间编辑器
        • QDateTime:日期
        • QDateTimeEdit:日期编辑器
        • QTimer:定时器
      • QMainWindow 主窗口 -- 相关
        • QMenu 菜单栏
        • QToolBar 工具栏
        • QStatusBar 状态栏
        • 中央窗口
      • 一些操作
        • 图片等比例缩放显示
        • 图片标签 和 文字标签居中 注意

学习中的错误

- 堆叠窗口 需要放在布局中。
- “程序异常结束”:声明了私有指针变量,直接使用(操作野指针)

常用快捷键

F1 //查看帮助,文档
F2 //快速到变量声明
F4 //在 cpp 和 h 文件切换
alt +enter //自动创建类的定义
Shift + F2 //函数的声明和定义之间快速切换
Shift+delete //剪切当前行
Ctrl + R //运行程序
Ctrl + B //Build 项目
Ctrl + / //注释当前行 或者 选中的区域

杂项

//sender() -- 谁产生信号进入的槽函数,通过转换函数转换为对应的派生类对象类型
//继承关系间的转换 static_cast OR dynamic_cast(含有虚函数)
QPushButton *pb = static_cast (sender());

str.chop(n); //去掉字符串str最后n个元素,改变了源字符串
str.indexOf('.'); //在str内查找子串
str.toLatin1(); //转为 QByteArray 类型

QString i; 
QString total;
QString fileName;
//位置编号必须在 1-99之间
QString status = QString("Processing file %1 of %2: %3")
              .arg(i).arg(total).arg(fileName);

布局

QHBoxLayout: 水平布局
	addWidget(QWidget *)  --- 添加控件
	addLayout(QLayout *)  --- 添加布局
	/*添加一个可拉伸空间,最小尺寸为零,拉伸系数为拉伸到该框布局的末端。*/
    hbox->addStretch();
QVBoxLayout:垂直布局
	addWidget(QWidget *)  --- 添加控件
	addLayout(QLayout *)  --- 添加布局
QGridLayout:栅格布局
	addWidget(QWidget *, int row, int column, int rowSpin, int columnSpin); 
	参数:控件、行、列、行跨度、列跨度

信号与槽

1、信号与槽函数关联: connect()
    一对一:
        一个信号对应一个槽函数
    一对多:
        一个信号对应多个槽函数
    多对一:
        多个信号对应同一个槽函数
2、信号与信号关联:
    sig1关联sig2时,当sig1产生时会自动触发sig2信号,但是sig2产生时不会触发sig1
3、解除关联:
    disconnect()
4、槽函数的参数:
    槽函数的参数是由信号的参数传递,因此:
        槽函数的参数个数一定是小于或等于信号的参数个数
        当槽函数有参数时,参数类型一定与信号对应参数类型一致
5、槽函数:
	如果槽函数是自定义的:
		声明需要放在slots标签之下
		定义放在cpp文件中
	槽函数也是类的成员函数,也可以像成员函数一样被调用
5、信号:
	当自定义信号时:
		类中需要加宏: Q_OBJECT
		信号的声明需要放在 signals 标签之下
		信号不需要定义
		发射信号:emit 信号;

数据库相关

QSqlDatabase	//数据库类
QSqlQuery	//执行sql语句类
QSqlError	//sql错误类
//Pro文件中添加 sql 模块

//添加sqlite数据库
QSqlDatabase mydb = QSqlDatebase::addDatabase("QSQLLITE");
//设置库名
mydb.setDatebaseName("user.db");
//打开数据库
if ( !mydb.open() )	//打开失败
	qDebug() << mydb.lastError().text();	//输出错误信息
	
//执行sql语句
query = new QSqlQuery(mydb);
if ( !query->exec("create tabel if not exists user(name text, pswd text)") )	//执行语句失败	
	qDebug() << query->lastError().text();	//输出错误信息
QString sql = QString("insert into user values('%1', '%2 ')").arg(name, pswd);
if( !query->exec(sql) )

//对于查找语句
query->exec("select * from user");
//查找到几条记录就循环几次
while( query->next() )  //循环每一行记录
{
	qDebug() << query->value(0).toString();	//输出第一列的信息
	qDebug() << query->value(1).toString();	//输出第一列的信息
}

QSS

选择器 {property:value}

QPushButton,QLineEdit{
	//属性不区分大小写
	color:red;
	background-color:white;
}

Qt样式表设置函数 setStyleSheet()

//:pressed按下时才触发
ui->pb->setStyleSheet(QString("QPushButton:pressed{
								color:rgb(255, 0, 0)
								}"));

QSS文本属性

Qt学习 - 总_第1张图片
Qt学习 - 总_第2张图片
Qt学习 - 总_第3张图片
Qt学习 - 总_第4张图片
Qt学习 - 总_第5张图片
Qt学习 - 总_第6张图片
Qt学习 - 总_第7张图片
Qt学习 - 总_第8张图片

事件

  • 当系统的类无法满足想要的需求时,自定义类,继承系统类,重写需要的事件
    //忽略该事件
    event->ignore();

QMouseEvent:鼠标事件

protected:
void mousePressEvent(QMouseEvent *event);   //鼠标按下事件
void mouseReleaseEvent(QMouseEvent *event); //鼠标释放事件
void mouseDoubleClickEvent(QMouseEvent *event); //鼠标双击事件
void mouseMoveEvent(QMouseEvent *event);    //鼠标移动事件

//设置追踪鼠标,不按下鼠标,鼠标移动时也能触发鼠标移动事件
setMouseTracking(true);

//event->button() 获取鼠标按下的按键,判断是左键|右键|中键...
//	enum Qt::MouseButton
if ( event->button() == Qt::LeftButton )
    qDebug() << "Mouse leftbutton pressed!";
else if ( event->button() == Qt::RightButton )
    qDebug() << "Mouse rightbutton pressed!";
else if ( event->button() == Qt::MidButton )
    qDebug() << "Mouse midbutton pressed!";
else if ( event->button() == Qt::MiddleButton )
    qDebug() << "Mouse middle pressed!";

//event->pos(); event->x(); event->y(); 获取鼠标按键的 相对Widget位置: x坐标 和 y坐标
qDebug() << event->pos() << event->x() << event->y();

//event->globalPos(); event->globalX(); event->globalY(); 获取鼠标按键的 相对屏幕位置: x坐标 和 y坐标
qDebug() << event->globalPos() << event->globalX() << event->globalY();

键盘事件

grabKeyboard() — 设置抓取按键:在非激活状态下也能抓取按键事件
setFocusPolicy(Qt::StrongFocus) — 设置强聚焦

void keyPressEvent(QKeyEvent *event);   //键盘按下事件
void keyReleaseEvent(QKeyEvent *event); //键盘松开事件

//判断按键按下的按键键
//	enum Qt::Key
if ( event->key() == Qt::Key_A )
    qDebug() << "A pressed";
else if ( event->key() == Qt::Key_Space )
    qDebug() << "Space pressed";
else if ( event->key() == Qt::Key_Return )  //主要按键区 Enter
    qDebug() << "Return pressed";
else if ( event->key() == Qt::Key_Enter )   //数字功能区 Enter
    qDebug() << "Enter pressed";
else
    qDebug() << "Other pressed";

QWheelEvent:滚轮事件

void wheelEvent(QWheelEvent *event);    //鼠标滚轮事件

//获取鼠标上滚还是下滚
qDebug() << event->angleDelta() << event->delta();
if( event->delta() > 0 )
    qDebug() << "Mouse up";
else
    qDebug() << "Mouse down";

QCloseEvent:关闭事件

void closeEvent(QCloseEvent *event);    //关闭事件
void resizeEvent(QResizeEvent *event);  //改变窗口大小事件
void hideEvent(QHideEvent *event);  //隐藏窗口事件 -

QTimerEvent:超时事件

void timerEvent(QTimerEvent *event); //定时器事件

//启动系统定时器,当超时时自动触发 定时器事件
startTimer(1000);

QEvent 中:事件过滤器

(只对关注的事件进行处理)

le1 = new QLineEdit;
le1->installEventFilter(this);  //安装事件过滤器(关注)

protected:
bool eventFilter(QObject *watched, QEvent *event);	//重写事件过滤器
参数:
watched:产生事件的对象
event:  产生的事件
返回值:
true:事件已被处理
false:  事件未被处理

bool Widget::eventFilter(QObject *watched, QEvent *event)
{
    //判断是否是想要关注的对象
    if( watched == le1 || watched == le2 || watched == le3 || watched == pb1 || watched == pb2)
    {
        //判断是否是想要关注的事件:事件类型是键盘按下事件
        if( event->type() == QEvent::KeyPress )
        {
            //获取按键按下的键:继承关系间,父类 -> 子类,转换函数
            QKeyEvent *e = static_cast(event);
            if(e->key() == Qt::Key_Up)
            {
                this->focusPreviousChild(); //聚焦到上一个子对象上
                return true;
            }
            else if(e->key() == Qt::Key_Down)
            {
                this->focusNextChild(); //聚焦到下一个子对象上
                return true;
            }

            /* 按下 Enter 键,输出行编辑器内容 */
            //当产生的事件是行编辑器时,再判断按下的按键是否时 Enter 键
            if( watched == le1 || watched == le2 || watched == le3 )
            {
                if(e->key() == Qt::Key_Return)
                {
                    //继承关系,父类->子类
                    QLineEdit *le = static_cast(watched);
                    qDebug() << le->text();
                }
            }
        }
    }
	return QWidget::eventFilter(watched, event); //事件未处理,返回父类事件过滤器处理
}

QPaintEvent:绘图事件

update(); //刷新,会触发绘图事件。在pixmap作画,不会消失

#include //“画家”
#include //“画笔”
#include //“刷子”

protected:
//绘图事件:当界面需要重绘
void paintEvent(QPaintEvent *event);

QPainter p(this);   //定义一个 "画家"
QPen pen(Qt::red);  //创建画笔,并设置画笔颜色
pen.setWidth(2);   //设置画笔粗细
pen.setColor(Qt::blue); 	//设置画笔颜色
p.setPen(pen);  //设置”画家“使用的"画笔"

p.drawPoint(66, 66);  //画点
p.drawPoint(QPoint);
p.drawLine(QPoint(3, 3), QPoint(200, 300)); //连线
p.drawRect(100, 100, 50, -100); //绘制矩形 x,y,w,h
p.drawEllipse(QPoint(66, 66), 66, 50);  //绘制椭圆:圆心,x半径,y半径
p.drawText(QPoint(200, 200), "Hello Qt");   //写字
//画图片
QImage img = QImage("./1.jpg");
img = img.scaled(200,200, Qt::KeepAspectRatio, Qt::SmoothTransformation);
p.drawPixmap(this->width()/2,this->height()/2,QPixmap(QPixmap::fromImage(img)));

p.translate(this->width()/2, this->height()/2); //"画家"移动,更新坐标系原点位置
p.rotate(150);   //"画家"转向,旋转坐标系 150°(顺时针)

QThread:线程

//定义线程:继承QThread类,重写run方法
myThread *thread = new myThread; //创建线程
thread->start(); //启动线程
thread->terminate(); //结束线程

void msleep(unsigned long msecs)
void sleep(unsigned long secs)
void usleep(unsigned long usecs)

//重写run方法
protected:
	void run();

public slots:
	void quit();
	void start();
	void terminate();

signals:
	void finished();
	void started();

线程通信 – QMutex:互斥锁

定义全局变量 QMutex mutex1;
外部引用 extern QMutex mutex1;

mutex1.lock();	//上锁
mutex1.unlock(); //解锁

线程通信 – QSemaphore:信号量

二值信号量、计数信号量

定义全局变量 QSemaphore sem1;
外部引用 extern QSemaphore sem1;;

sem1.acquire(); //申请资源 P操作
sem1.release(); //释放资源 V操作

网络相关

QUdpSocket:UDP套接字

Pro文件中添加 network 模块
创建套接字:创建Udp套接字对象
绑定本机地址和端口:bind(QHostAddress, quint16);
发送数据:writeDatagram(QByteArray, QHostAddress, quint16);
接收数据:readDatagram(QByteArray, QHostAddress *, quint16 *);

#include //Udp套接字
#include //IP地址
QUdpSocket *udpSocket;
使用这个类最常见的方法是使用bind()绑定到地址和端口
if( ! udpSocket->bind(QHostAddress::AnyIPv4, 8848) )

然后调用writeDatagram()和readDatagram() / receiveDatagram()来传输数据。
udpSocket->writeDatagram(str.toLatin1(), ip, port);
udpSocket->readDatagram(buf, sizeof(buf), &ip, &port);

如果您想使用标准的QIODevice函数read(), readLine(), write()等,您必须首先通过调用 connectToHost()将套接字直接连接到对等体。
每当一个数据报被写入网络时,套接字都会发出bytesWritten()信号。
如果只是想发送数据报,则不需要调用bind()。
每当数据报到达时,都会发出readyRead()信号。
在这种情况下,hasPendingDatagrams()返回true。

//当有数据可收时,触发readRead()信号,绑定槽进行接收数据操作
connect(udpSocket, SIGNAL(readyRead()), this, SLOT(recv_data()));
//也可以 while (udpSocket->hasPendingDatagrams()) 时进行接收数据操作

注意:应该在接收readyRead()信号时读取传入的数据报,否则将不会为下一个数据报发出该信号。

QTcpSocket:tcp通信套接字

Pro文件中添加 network 模块
创建套接字:创建tcp套接字对象
绑定本机地址和端口:bind(QHostAddress, quint16);
连接服务器:connectToHost(QHostAddress, quint16);
发送数据:write
接收数据:read/readAll

#include    //Tcp协议
#include  //IP地址

//主动连接服务器
tcpSocket->connectToHost(ip, port.toUShort());
tcpSocket->close();//关闭套接字
tcpSocket->write(str.toLatin1());
QByteArray data = tcpSocket->readAll();

signals:
	connected(); --- 当连接成功时
	disconnected(); --- 当连接断开时
	readyRead(); --- 当有数据可收时

//当连接成功时,触发connected()信号
connect(tcpSocket, SIGNAL(connected()), this, SLOT(show_connected()));
//当断开连接时,触发disconnected()信号
connect(tcpSocket, SIGNAL(disconnected()), this, SLOT(show_disconnected()));
//当有数据可接收时,触发信号readRead()
connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(recv_dataa()));

QTcpServer:tcp连接套接字

Pro文件中添加 network 模块
创建套接字:创建tcp套接字对象
绑定+监听:listen(QHostAddress, quint16); //IP地址和端口号

//当有客户端连接服务器是,触发newConnection()信号
connect(tcpServer, SIGNAL(newConnection()), this, SLOT());

//当有等待的连接
if( tcpServer->hasPendingConnections() )

//接收连接,生成tcp通信套接字
tcpSocket = tcpServer->nextPendingConnection();

tcpSocket->bytesAvailable();  --- 获取可收的字节数

tcp并发服务器:
//继承QTcpServer类,重写虚函数 incomingConnection(qintptr socketDescripter);
//当有新的连接进来时,会自动进入,成功连接生成通信套接字描述符
fd = socketDescripter;
tcpSocket->setSocketDescripter(fd); //设置通信套接字描述符
tcpSocket->waitForReadyRead(-1); //等待有数据可读
接收数据
if ( data.isEmpty() ) 		客户端退出连接
tcpSocket->peerAddress().toString(); --- 获取发送方的ip地址

tcpSocket->close();
tcpSocket->deleteLater(); //删除

QPixmap

QPixmap *pixmap = new QPixmap(800, 600); //创建一张空白图片
pixmap = new QPixmap("Filename");
pixmap->fill(); //填充白色

QFile:文件相关

windows 打开文件,默认为文本流,‘\n’ 为 ‘\r’+‘\n’

QFile file("../file/1.txt");
if(file.exists()) //判断文件是否存在
file.bytesAvailable();  //可用字节数(可读字节数)
file.size();	//文件大小
QString errorString() --- 获取错误信息
atEnd() --- 判断是否到达文件末尾
QByteArray data = file.readAll();   //读取全部
QByteArray data = file.read(1); //读取一个字节
QByteArray data = file.readLine();  //读取一行
write() --- 写入数据
open() --- 打开文件: QIODevice::ReadOnly, ReadWrite,Append,Truncate.
close() --- 关闭文件
file.seek(0);   //定位(lseek/fseek)
file.link("1.lnk"); //生成快捷方式,文件名以 .lnk为后缀

/******************e.g.****************/
 QFile file(filename);   //创建文件对象
if( !file.open(QIODevice::ReadOnly | QIODevice::Text) ) //以只读方式开发文件
{
    QString str = filename + ": " + file.errorString();   //获取错误信息
    QMessageBox::warning(this, "警告", str);  //弹出警告框
    return;
}

//读取文件内容
while( !file.atEnd() )  //判断是否读取到文件末尾
{
    QByteArray data = file.readAll();   //读取文件所有内容
    te->setText(data);                  //写入文本编辑器
}

//将文本编辑器的内容写入文件中
QString str = te->toHtml(); //带格式的内容
file.write(str.toStdString().c_str(), str.length());  //类型转换 QString -> string -> char *

file.close();	//关闭文件

QFileInfo:文件信息

QFileInfo finfo("../file/1.txt");
if(finfo.exists()) //判断文件是否存在
finfo.size(); //获取文件大小

isDir() --- 判断是目录
isHidden() --- 判断是隐藏文件
if( finfo.isFile() )    //判断是否是普通文件

//获取文件的创建日期 转为String类型
finfo.created().toString("yyyy-MM-dd hh:mm:ss A ddd");

finfo.absoluteFilePath();	//获取文件的绝对路径
finfo.absolutePath();  //获取目录名,返回QString

//获取文件所在目录
QDir dir = finfo.absoluteDir();	//返回 QDir

QDir:目录相关

cd(QString) --- 切换工作目录
cdUp() --- 上一级

//设置过滤方式	enum QDir::Filter
dir.setFilter(QDir::Files | QDir::Hidden | QDir::NoSymLinks);

//设置排序, 按文件大小,逆序		enum QDir::SortFlag
dir.setSorting(QDir::Size | QDir::Reversed);

QFileInfoList list = dir.entryInfoList();	//读取目录下的所有文件
std::cout << "     Bytes Filename" << std::endl;
for (int i = 0; i < list.size(); ++i)
{ //遍历每一个文件
    QFileInfo fileInfo = list.at(i);
    std::cout << qPrintable(QString("%1 %2").arg(fileInfo.size(), 10) //文件大小
                            .arg(fileInfo.fileName()));               //文件名
    std::cout << std::endl;
}

QWidget 相关

QWidget

show()  ---- 显示
hide()  ---- 隐藏
close() ---- 关闭
setFixedSize(int w, int h)  ---- 设置固定大小
setFixedWidth(int w)  ---- 设置固定宽度
setFixedHeight(int h)  ---- 设置固定高度
setMaximunSize(int w, int h);  //设置最大尺寸
setMinimunSize(int w, int h);  //设置最小尺寸
setWindowsTitle(QString);   //设置窗口标题
setWindowsIcon(QIcon);   // 设置窗口的图标

QPushButton: 按钮

QString text()  --- 获取按钮上的内容
setText(QString)  --- 设置按钮上的内容
SIGNAL:
	clicked()  ---- 点击
	pressed()  ---- 按下
	released() ---- 松开
setEnabled(bool)  --- 使能/失能 按钮,默认使能按钮
setFont(QFont)  --- 设置字体
//字体对象:字体名称  字体大小  加粗
QFont font("Times", 20, QFont::Bold);
setFlat(bool) --- 设置按钮透明

QLineEdit: 行编辑器

QString text()  --- 获取内容
setText(QString)  --- 设置内容
setMaxLength(int)  --- 设置最大长度
setAlignment(Qt::Alignment) ---- 设置对齐方式
setFont(QFont)  --- 设置字体
setEchoMode(QLineEdit::Passwd) --- 设置加密显示, QLineEdit::Normal -正常显示
SIGNAL:
	textChanged(QString)  --- 当内容改变时

QCheckBox: 复选框

isChecked() ---- 判断是否选中
SIGNAL:
	clicked()

QRadioButton: 单选按钮

isChecked ---- 判断是否被勾选
SIGNAL:
	clicked()

QGroupBox: 分组框

setLayout(QLayout *)  --- 添加布局

QLabel: 标签

setText(QString) --- 设置内容
setPixmap(QPixmap) --- 设置图片
setScaledContents(bool) --- 设置自适应

QFileDialog: 文件对话框

QString QFileDialog::getOpenFileName() --- 打开文件对话框,获取选中的文件名
QStringList QFileDialog::getOpenFileNames() --- 打开文件对话框,获取选中的多个文件名
//过滤 "ALL (*);; Image (*.jpg *.bmp *.png)")

QString QFileDialog::getSaveFilename() --- 获取保存的文件名
QDir QFileDialog::getOpenDirectory() --- 获取打开的目录名

Qt学习 - 总_第9张图片

QInputDialog 输入对话框

文本输入、整型输入、浮点型输入
QString QInputDialog::getText() — 获取输入的字符串 QLineEdit
int QInputDialog::getInt() — 获取输入的整数 QSpinBox
double QInputDialog::getDouble() — 获取输入的浮点数 QDoubleSpinBox

/******e.g.*******/
bool ok;
// 文本输入
QString str = QInputDialog::getText(this, "Input", "输入名字: ", QLineEdit::Normal,\
                      "李四", &ok);
if( str.isEmpty() || !ok )
    return;
    
//整型输入
int num = QInputDialog::getInt(this, "Input", "学号: ", 0, 0, \
                               100, 1, &ok);
if( !ok )
    return;

Qt学习 - 总_第10张图片

QMessageBox 消息框

exec() — 模态对话框
show() — 非模态对话框
QMessageBox::question() — 问题消息框
QMessageBox::warning() — 警告框
QMessageBox::information() — 信息框
QMessageBox::about() — 关于
自定义框:

/*************e.g. 自定义框*******************/
QMessageBox msgBox;	//自定义框
msgBox.setText("The document has been modified.");
msgBox.setInformativeText("Do you want to save your changes?");
msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);
msgBox.setButtonText(QMessageBox::Discard, "not save");//自定义按钮文字
msgBox.setDefaultButton(QMessageBox::Save); //设置默认选中

int ret = msgBox.exec();//模态显示对话框 -- 未结束当前窗口前不能访问其他窗口

switch (ret) {
    case QMessageBox::Save:
        qDebug() << "save";
        break;
    case QMessageBox::Discard:
        qDebug() << "d save";
        break;
    case QMessageBox::Cancel:
        qDebug() << "cancel";
        break;
    default:
        qDebug() << "nnnnn";
        break;
}
/*******************************/
QMessageBox::information();
QMessageBox::warning(this, "Warning", "Empty!!");
QMessageBox::question(this, "Question", "???");
QMessageBox::aboutQt(this, "关于Qt");

Qt学习 - 总_第11张图片

QFontDialog 字体对话框

QFont QFontDialog::getFont() — 获取选中的字体

bool ok;
QFont font = QFontDialog::getFont(&ok, this);
if(!ok)
    return;

Qt学习 - 总_第12张图片

QColorDialog 颜色对话框

QColor QColorDialog::getColor() — 获取选中的颜色

QColor color = QColorDialog::getColor();
if ( color.isValid() )  //判断是否有效
{
    //te->setTextColor(color); //改变选中的字体颜色,和之后输入的字体颜色
}

Qt学习 - 总_第13张图片

自定义对话框 class myDialog : public QDialog

  • Q_OBJECT

QTextEdit:文本编辑器

QString toHtml() --- 获取带格式的内容
QString toPlainText() --- 获取纯文本

QListWidget:列表部件

#include 	//列表部件内复杂item

addItem(QListWidgetItem *item) --- 添加复杂item
addItems(QStringList list) --- 添加列表
addItem(QString) --- 添加条目
int currentRow() --- 当前选中的item位置
QListWidgetItem *item takeItem( int pos ) --- 取走pos处的item

QComboBox:下拉条(下拉列表框、组合框)

addItem(QString) --- 添加条目
addItem(QListWidgetItem *item) --- 添加复杂item
addItems(QStringList list) --- 添加条目列表
insertItem(int index, 条目) --- 插入item
setCurrentIndex(int index) --- 设置当前item
SIGNAL:
	currentIndexChanged(int index) --- 当选择不同的item改变时
	currentIndexChanged(const QString &text) --- /改变当前选中

QStackedWidget:堆叠窗口

addWidget(QWidget *) --- 添加页面,第0页开始
setCurrentIndex(int row) --- 设置当前页 为第row页
int currentIndex() --- 获取当前页
int count() --- 获取总页数

QSpinBox:自旋框(整数)

setValue(int) --- 设置初始值
setRange(int min, int max) --- 设置范围
setMaximum(23) --- 设置最大值
setMinimum(-10) --- 设置最小值
setReadOnly(bool) --- 设置只读,只能通过代码修改
setSingleStep(2) --- 设置步长
setPrefix("距离: ") --- 设置前缀
setSuffix("米") --- 设置后缀
SIGNAL:
	valueChanged(int) --- 当值改变时
	valueChanged(QString)

QDoubleSpinBox:数字设定框(浮点数)

setValue(double) --- 设置初始值
setRange(-6.2, 6.9) --- 设置范围
setReadOnly(true) --- 设置只读,只能通过代码修改
setSingleStep(double) --- 设置步长
setPrefix("距离: ") --- 设置前缀
setSuffix("米") --- 设置后缀
setDecimals(2) --- 设置精度
SIGNAL:
	valueChanged(double) --- 当值改变时
	valueChanged(QString)

QSlider:滑动条

setValue(50) --- 设置值
setRange(0, 100) --- 范围
setOrientation(Qt::Horizontal) --- 设置水平放置, Qt::vertical 垂直放置

QScrollBar:滚动条

setValue(50) --- 初值
setRange(0, 100) --- 范围
setOrientation(Qt::Horizontal) --- 设置水平放置, Qt::vertical 垂直放置

QProgressBar:进度条

setValue(50) --- 初值
setRange(0, 100) --- 范围

QTime:时间

addSecs() --- 增加时间:秒
addMsecs() --- 怎加时间:毫秒
hour() --- 获取小时
minute() --- 获取分钟
second() --- 获取秒数

static public function:
	QTime t = QTime::currentTime() --- 获取当前时间

QTimeEdit:时间编辑器

setTime(QTime) --- 设置时间
setDisplayFormat("hh:mm:ss") --- 设置显示格式

QDateTime:日期

static public functions:
	QDateTime dt = QDateTime::currentDateTime() --- 获取当前日期

QDateTimeEdit:日期编辑器

setDateTime(QDataTime) --- 设置日期
setDisplayFormat("yyyy-MM-dd hh::mm:ss A ddd") --- 年-月-日 时:分:秒 上(下)午 星期

QTimer:定时器

start(1000) --- 启动定时器,毫秒单位,1s = 1000ms = 1000000us
stop() --- 停止定时器
SIGNAL:
	timeout()	--- 超时信号

QMainWindow 主窗口 – 相关

QMenu 菜单栏

#include 
#include 

QMenu *filemenu, *editmenu;
//filemenu = new QMenu("文件");	//创建 “文件“ 菜单栏
//editmenu->addMenu(QMenu *);	//添加菜单

//创建并添加菜单栏
filemenu = menuBar()->addMenu("文件");
editmenu = menuBar()->addMenu("编辑");	

//添加动作: 新建和打开
QAction *newAct, *open;
//添加动作
newAct = new QAction("新建");
newAct->setIcon(QIcon(":/1.ico")); //设置图标
newAct->setShortcut(QKeySequence::New); //设置快捷键
setShortcut( QKeySequence( "Ctrl+N" ) ) --- 设置自定义快捷键
newAct->setStatusTip("新建文件......"); //状态栏提示

newAct->setCheckable(true);//设置 开启可勾选
newAct->setChecked(true);  //设置默认勾选

open = new QAction("打开");
open->setIcon(QIcon(":/1.ico")); //设置图标
open->setShortcut(QKeySequence::Open); //设置快捷键
newAct->setStatusTip("打开文件......"); //状态栏提示

filemenu->addAction(newAct);
filemenu->addAction(open);	--- 添加动作
filemenu->addMenu(QMenu *)  --- 添加菜单

//添加多个动作
QList  formatActs = {fontAct, colorAct};
formatMenu = menuBar()->addMenu("格式");
formatMenu->addActions(formatActs);

SIGNAL:
	triggered() --- 触发信号

QToolBar 工具栏

QToolBar *filetool, *edittool;
//创建工具栏
filetool = addToolBar("文件");
//添加动作
filetool->addAction(newAct);
filetool->addAction(open);

QStatusBar 状态栏

QStatusBar *sbar;
//状态栏
sbar = statusBar();
sbar->addWidget(QWidget *widget);	//添加窗口

中央窗口

//设置中央窗口
setCentralWidget(QWidget *widget); 

一些操作

图片等比例缩放显示

#include 
#include 
#include 

将图片使用image打开,通过pixmap,放到label标签中
// 声明私有变量 QLabel *l;
l = new QLabel(this);
l->setFixedSize(500, 500);

QImage img = QImage("./1.png");	//QPixmap pixmap = QPixmap("./1.png");
//参数:大小,等比例缩放,平滑处理
img = img.scaled(l->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation);
//pixmap = pixmap.scaled();

l->setPixmap(QPixmap::fromImage(img));
//l->setPixmap(pixmap);

图片标签 和 文字标签居中 注意

//窗口大小
this->setFixedSize(1600, 900);

l = new QLabel();
l->setFixedSize(500, 300);

QImage img = QImage("./1.png");
img = img.scaled(500, 500, Qt::KeepAspectRatio, Qt::SmoothTransformation);

QPixmap pixmap = QPixmap(QPixmap::fromImage(img));
l->setPixmap(pixmap);

l1 = new QLabel("This is a Picture.");

//控件label l1内容 居中
l1->setAlignment(Qt::AlignCenter);

vbox1 = new QVBoxLayout;
vbox1->addWidget(l);
vbox1->addWidget(l1);

//垂直布局整体 居中
vbox1->setAlignment(Qt::AlignCenter);

setLayout(vbox1);

Qt学习 - 总_第14张图片

你可能感兴趣的:(qt)