自己备忘的常见的qt小知识点
知识点
文件判断是否存在、可读、可写、可编辑QString转成char接上面 c_str和.data()区别
1.拼接2.格式化3.数字转字符串文版框输出数字转字符串函数QString::number(a,10,2);4.判断字符串是否为空5.格式化6.数字转字符串7.移出空白字符8.字符串转换9.比较 > < >= <= ==10.nsert()//字符串加入11.prepend() 在原字符串开头插入另一个字符串12.引用外部资源extern13.互斥锁14.replace() 用指定的字符串替换原字符串中的某些字符15.文件存取16.qt鼠标定位以及定时器键盘按下事件鼠标按下事件鼠标按下换图标
鼠标移动事件鼠标按住进行页面移动
鼠标双击事件鼠标双击进行
鼠标抬起事件鼠标抬起恢复原本指针
鼠标滚轮事件定时器事件
17.模态窗口setModal18.文件选择对话框、颜色选择对话框、字体选择对话框19.消息框疑问消息框questioninfomation对话框information"Critical消息框"critical警告消息框warning自定义消息框关于qt消息框aboutQt关于消息框about输入对话框getText;getInt;getDouble向导对话框进度对话框
20.文本框的选择toPlainText();toHtml();text();currentText()21.控件样式动态更改22.字体更改23.label中添加动画以及图片动态添加label按键进行隐藏窗口
24.lcdNumber显示系统时间lcdNumber位移
25.菜单栏设置26.文本处理富文本框处理TextEdit使用拖放来打开文本设置图片拖拽设置打印转换格式pdf
27正则表达式控件提示框
28定时器29comBox 添加信息及其美化30button删除tableWidget中某一行页面删除deleteLaterexternwriteDatagram通信发送函数tablewidget用法tablewidget加按钮
二 页面美化设置1. 伪状态(鼠标放在页面上的状态)2.屏蔽窗口3.页面透明度窗口部件提升更改list中.at特定位置中的值 [ ]定时器周期
.其他未整理常用插件函数常用MIME类型数据处理函数settoolTep函数
三 qt小程序1.读取xml
知识点
文件判断是否存在、可读、可写、可编辑
头文件:<io.h>
函数原型:int _access(const char *pathname, int mode);
参数:pathname 为文件路径或目录路径 mode 为访问权限(在不同系统中可能用不能的宏定义重新定义)
返回值:如果文件具有指定的访问权限,则函数返回0;如果文件不存在或者不能访问指定的权限,则返回-1.
备注:当pathname为文件时,_access函数判断文件是否存在,并判断文件是否可以用mode值指定的模式进行访问。当pathname为目录时,_access只判断指定目录是否存在,在Windows NT和Windows 2000中,所有的目录都只有读写权限。
mode的值和含义如下所示:
00——只检查文件是否存在
02——写权限
04——读权限
06——读写权限
#include <io.h>
#include <stdio.h>
#include <stdlib.h>
int main
( )
{
if ( ( _access
( “IsExist
.txt”
, 0 ) ) != - 1 )
{
printf
( “File IsExist
.txt exists
.n”
) ;
if ( ( _access
( “IsExist
.txt”
, 2 ) ) != - 1 )
printf
( “File IsExist
.txt does
not have write permission
.\n”
) ;
}
return 0 ;
}
QString转成char
1、方式1:QString ->QByteArray->char*
QString str
= "hello";
char * ch
= str
.toLatin1().data();
//或者
char * ch
= str
.toLocal8Bit().data();
2、方式2:QStirng---->String —>char*
QString str
= "hello";
char * ch
= str
.toStdString().c_str();
接上面 c_str和.data()区别
c_str()和data():生成一个const char*指针,指向一个临时数组。
c_str()函数返回一个指向正规C字符串的指针,内容与string串相同。
C++中c_str()主要用法就是为了与C语言兼容,在C语言中没有string类型,故必须通过string的对象的成员函数c_str()把string对象转换成C中的字符串样式。
c_str()以char*形式传回string内含字符串。
char c
[20];
string s
= "1234";
strcpy(c
,s
.c_str());
1.拼接
QString s1
= "hello ";
QString s2
= "world";
s1
+= s2
;
s1
.append(" farsight");
2.格式化
s1
.sprintf("%s %d","哈哈",100);
s1
= QString("%1 was born in %2").arg("小明").arg(1900);
3.数字转字符串
QString s
= QString().setNum(16);
文版框输出数字转字符串函数QString::number(a,10,2);
ui
->lineEdit_5
->setText(QString
::number(a
[0],10,2));
这个文章进行了详细介绍
4.判断字符串是否为空
QString s ; s.isEmpty()
示例:
if(!s
.isEmpty())
{
s
.append('0');
ui
->label_choose
->setText(s
);
}
5.格式化
将"哈哈" 100 输出; char buf[100];
sprintf(buf,"%s %d",“哈哈”,100);
//替换 1替换成第一个arg中的参数 2替换第二个arg中的参数 s1 = QString("%1 was born in %2").arg(“小明”).arg(1900);
6.数字转字符串
QString s = QString().setNum(16); QString s1 = QString("%1").arg(16);
7.移出空白字符
QString s5
= " hello good farsight ";
s5
= s5
.trimmed();
qDebug()<<s5
;
s5
= s5
.simplified();
qDebug()<<s5
;
8.字符串转换
toInt() toDouble() toFloat() toLong() toLongLong()
QString s6
= "123";
bool ok
;
int hex
= s6
.toInt(&ok
,16);
if(ok
)
{
qDebug()<<hex
;
}
int dec
= s6
.toInt(&ok
);
qDebug()<<dec
;
9.比较 > < >= <= ==
QString s7
= "hello";
QString s8
= "helo";
if(s7
> s8
)
qDebug()<<"s7>s8";
else
qDebug()<<"not";
10.nsert()//字符串加入
11.prepend() 在原字符串开头插入另一个字符串
wordhello
12.引用外部资源extern
extern int DataSize;//引用了main函数中定义的DataSize t1.cpp中:
#include “t1.h” //如果你的不是当前路径,自己弄好路径
int myData; //只在一个文件件中这样做一次,后面别的文件想用时,只包头文件就可以了
// int myData =0; //可以定义可以赋值,可以不赋值
t2.cpp中:
#include “t1.h” //如果你的不是当前路,自己弄好路径,这个不用说吧
//注意在t1.cpp中已经定义了,后面使用的文件就不要定义myData,直接拿来用即可
//假如你的t2.cpp中有一个方法需要用到myData,这个方法就int getMyData();于是可以这样
[原文链接](https://blog.csdn.net/Soar_dream/article/details/101025153)
13.互斥锁
互斥锁 QMutex类和QMutexLocker类 作用:解决由于覆盖,导致的结果不正确 目的:保护一个对象,同一时间只有一个线程可以访问它。 当多个线程访问共享内存时,应使用锁讲对共享变量的操作代码包裹,易保证同步访问共享变量; c++中引起线程安全的共享资源有两种:全局变量和静态变量。
void consummer
::run()
{
for(int i
= 0 ; i
< DataSize
; i
++)
{
mutex
.lock();
buffer
--;
qDebug()<<"consummer:"<<buffer
;
mutex
.unlock();
}
}
int main(int argc
, char *argv
[])
{
QCoreApplication
a(argc
, argv
);
consummer con
;
producer pro
;
con
.start();
pro
.start();
con
.wait();
pro
.wait();
14.replace() 用指定的字符串替换原字符串中的某些字符
s1.replace(“e”,s2);这样竟然也行?
ui界面的设置: ui->lineEdit_psw->setMaxLength(6);//密码长度6位 ui->lineEdit_psw->setEchoMode(QLineEdit::Password);//密码不可见
15.文件存取
void MainWindow
::on_pushButton_clicked()
{
QString path
= "d:/wd/";
QDir
dir(path
);
if(!dir
.exists())
{
dir
.mkpath(path
);
}
QStringList fileList
= dir
.entryList();
for(int i
= 2; i
<fileList
.size(); i
++)
{
ui
->listWidget
->addItem(fileList
.at(i
));
}
qDebug()<<fileList
.at(0)<<" "<<fileList
.at(1);
}
16.qt鼠标定位以及定时器
键盘按下事件
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow
::MainWindow(QWidget
*parent
) :
QMainWindow(parent
),
ui(new Ui
::MainWindow
)
{
ui
->setupUi(this);
setMouseTracking(true);
ui
->centralWidget
->setMouseTracking(true);
timerCount1
= 0;
timerCount2
= 0;
}
MainWindow
::~MainWindow()
{
delete ui
;
}
void MainWindow
::keyPressEvent(QKeyEvent
*e
)
{
QString head
;
if(e
->modifiers() == Qt
::NoModifier
)
{
}else if(e
->modifiers() == Qt
::ControlModifier
)
{
head
+="Ctrl +";
}else if(e
->modifiers() == Qt
::ShiftModifier
)
{
head
+="shift +";
}else if(e
->modifiers() == Qt
::AltModifier
)
{
head
+="alt +";
}
switch (e
->key()) {
case Qt
::Key_A
:
ui
->label_key
->setText(head
+"A");
break;
case Qt
::Key_Up
:
ui
->label_key
->setText(head
+"up");
break;
default:
ui
->label_key
->setText(QString().setNum(e
->key()));
break;
}
}
鼠标按下事件
void MainWindow
::mousePressEvent(QMouseEvent
*e
)
{
int x
= e
->x();
int y
= e
->y();
QString position
= QString("x: %1 y: %2").arg(x
).arg(y
);
switch (e
->button()) {
case Qt
::LeftButton
://鼠标左键
ui
->label_mousepress
->setText("按下左键"+position
);
break;
case Qt
::RightButton
://鼠标右键
ui
->label_mousepress
->setText("按下右键"+position
);
break;
case Qt
::MidButton
://中键
ui
->label_mousepress
->setText("按下中键"+position
);
break;
default:
break;
}
}
鼠标按下换图标
void MainWindow
::mousePressEvent(QMouseEvent
*even
)
{
if(even
->button()==Qt
::LeftButton
)
{
QCursor cursor
;
cursor
.setShape(Qt
::PointingHandCursor
);
QApplication
::setOverrideCursor(cursor
);
}
else if(even
->button()==Qt
::RightButton
)
{
QCursor
corcle(QPixmap("../mymouseevent/logo.png"));
QApplication
::setOverrideCursor(corcle
);
}
}
鼠标移动事件
void MainWindow
::mouseMoveEvent(QMouseEvent
*e
)
{
QString position
= QString("移动 x: %1 y: %2").arg(e
->x()).arg(e
->y());
ui
->label_mousemove
->setText(position
);
}
鼠标按住进行页面移动
void Widget
::mouseMoveEvent(QMouseEvent
*event
)
{
if(event
->buttons() & Qt
::LeftButton
){
QPoint temp
;
temp
= event
->globalPos() - offset
;
move(temp
);
}
}
鼠标双击事件
void MainWindow
::mouseDoubleClickEvent(QMouseEvent
*e
)
{
int x
= e
->x();
int y
= e
->y();
QString position
= QString("x: %1 y: %2").arg(x
).arg(y
);
switch (e
->button()) {
case Qt
::LeftButton
://鼠标左键
ui
->label_mousedouble
->setText("双击左键"+position
);
break;
case Qt
::RightButton
://鼠标右键
ui
->label_mousedouble
->setText("双击右键"+position
);
break;
case Qt
::MidButton
://中键
ui
->label_mousedouble
->setText("双击中键"+position
);
break;
default:
break;
}
}
鼠标双击进行
void Widget
::mouseDoubleClickEvent(QMouseEvent
*event
)
{
if(event
->button() == Qt
::LeftButton
){
if(windowState() != Qt
::WindowFullScreen
)
setWindowState(Qt
::WindowFullScreen
);
else setWindowState(Qt
::WindowNoState
);
}
}
鼠标抬起事件
void MainWindow
::mouseReleaseEvent(QMouseEvent
*e
)
{
int x
= e
->x();
int y
= e
->y();
QString position
= QString("x: %1 y: %2").arg(x
).arg(y
);
switch (e
->button()) {
case Qt
::LeftButton
://鼠标左键
ui
->label_mouserelease
->setText("抬起左键"+position
);
break;
case Qt
::RightButton
://鼠标右键
ui
->label_mouserelease
->setText("抬起右键"+position
);
break;
case Qt
::MidButton
://中键
ui
->label_mouserelease
->setText("抬起中键"+position
);
break;
default:
break;
}
}
鼠标抬起恢复原本指针
void Widget
::mouseReleaseEvent(QMouseEvent
*event
)
{
QApplication
::restoreOverrideCursor();
}
鼠标滚轮事件
void Widget
::wheelEvent(QWheelEvent
*event
)
{
if(event
->delta()>0){
ui
->textEdit
->zoomIn();
}
else{
ui
->textEdit
->zooOut();
}
}
定时器事件
Qt中进行定时器#include<QTime>
QTimer
* my_time
=new QTimer();
connect(my_time
,SIGNAL(timeout()),this,SLOT(MyFunction()));
my_time
->start(200);
void MainWindow
::timerEvent(QTimerEvent
*e
)
{
if(e
->timerId() == timerId1
)
{
timerCount1
++;
ui
->progressBar
->setValue(timerCount1
);
ui
->label_timer1
->setNum(timerCount1
);
}else if(e
->timerId() == timerId2
)
{
timerCount2
++;
ui
->label_timer2
->setNum(timerCount2
);
}
}
void MainWindow
::on_pushButton_start_clicked()
{
timerId1
= startTimer(1000);
timerId2
= startTimer(2000);
}
void MainWindow
::on_pushButton_stop_clicked()
{
killTimer(timerId1
);
ui
->progressBar
->setValue(0);
ui
->label_timer1
->clear();
killTimer(timerId2
);
ui
->label_timer2
->clear();
}
//头文件
public:
//重写四个函数,鼠标的四种情况 包含头文件#include <QMouseEvent>
//鼠标按下
void mousePressEvent(QMouseEvent *e);
//鼠标抬起 释放
void mouseReleaseEvent(QMouseEvent *e);
//鼠标移动
void mouseMoveEvent(QMouseEvent *e);
//鼠标双击
void mouseDoubleClickEvent(QMouseEvent *e);
//键盘事件 #include <QKeyEvent> 重写方法
void keyPressEvent(QKeyEvent *e);
//重写方法
void timerEvent(QTimerEvent *e);
int timerId1;
int timerId2;
int timerCount1;
int timerCount2;
private slots:
void on_pushButton_start_clicked();
void on_pushButton_stop_clicked();
17.模态窗口setModal
void MainWindow
::on_pushButton_clicked()
{
MyDialog
*md
= new MyDialog(this);
md
->setModal(true);
md
->setWindowModality(Qt
::WindowModal
);
md
->show();
}
18.文件选择对话框、颜色选择对话框、字体选择对话框
文件选择对话框
QString fileName = QFileDialog::getOpenFileName(this, tr(“Open File”), “/home”, tr(“Images (*.png *.xpm *.jpg)”));
QString selectFilter
;
QString fileName
= QFileDialog
::getOpenFileName(
this,
"选择文件对话框测试",
"/",
"C++ files(*.cpp);;C files(*.c);;Head files(*.h)",
&selectFilter
);
ui
->lineEdit_filename
->setText(fileName
);
qDebug()<<selectFilter
;
颜色选择对话框
QColor color
= QColorDialog
::getColor(Qt
::blue
,
this,
"标准颜色对话框"
);
if(color
.isValid())
{
ui
->label_color
->setFrameShape(QFrame
::Box
);
ui
->label_color
->setAutoFillBackground(true);
ui
->label_color
->setPalette(QPalette(color
));
}
字体选择对话框
void MainWindow
::on_pushButton_font_clicked()
{
bool ok
;
QFont
f("宋体");
QFont font
= QFontDialog
::getFont(
&ok
,
f
,
this,
"标准字体选择对话框"
);
ui
->lineEdit_font
->setText("测试文本");
ui
->lineEdit_font
->setFont(font
);
}
19.消息框
疑问消息框question
void MyDialog
::on_pushButton_question_clicked()
{
int ques
= QMessageBox
::question(
this,
"question消息框",
"是否退出消息对话框",
QMessageBox
::Ok
|QMessageBox
::Cancel
,
QMessageBox
::Ok
);
switch (ques
) {
case QMessageBox
::Ok
:
ui
->label
->setText("question 对话框 ok");
break;
case QMessageBox
::Cancel
:
ui
->label
->setText("question 对话框 cancle");
break;
default:
break;
}
infomation对话框information
void MyDialog
::on_pushButton_infomation_clicked()
{
int choose
= QMessageBox
::information(
this,
"Infomation消息框",
"欢迎来到InfomationMsg测试",
QMessageBox
::Ok
,
QMessageBox
::NoButton
);
if(choose
== QMessageBox
::Ok
)
ui
->label
->setText("infomation对话框 ok");
}
"Critical消息框"critical
void MyDialog
::on_criticalMsg_clicked()
{
ui
->label
->setText("Critical Message Box");
int choose
= QMessageBox
::critical(
this,
"Critical消息框",
"这是一个Critical消息框测试",
QMessageBox
::Cancel
|QMessageBox
::Ok
,
QMessageBox
::NoButton
);
}
警告消息框warning
v
oid MyDialog
::on_warningMsg_clicked()
{
ui
->label
->setText("Warning Message Box");
int choose
= QMessageBox
::warning(
this,
"Warning消息框",
"您的文档尚未保存,是否要保存",
QMessageBox
::Save
|QMessageBox
::Discard
|QMessageBox
::Cancel
,
QMessageBox
::Save
);
switch(choose
)
{
case QMessageBox
::Save
:
ui
->label
->setText("Warning/save");
break;
case QMessageBox
::Discard
:
ui
->label
->setText("Warning/discard");
break;
case QMessageBox
::Cancel
:
ui
->label
->setText("Warning/Cancel");
break;
}
}
自定义消息框
void MyDialog
::on_customMsg_clicked()
{
ui
->label
->setText("Custom Message Box");
QMessageBox customMsg
;
QPushButton
* pyes
= customMsg
.addButton("yes",QMessageBox
::ActionRole
);
QPushButton
* pno
= customMsg
.addButton("no",QMessageBox
::ActionRole
);
QPushButton
* pcancel
= customMsg
.addButton(QMessageBox
::Cancel
);
customMsg
.setWindowTitle("Custom消息框");
customMsg
.setText("这是我们自定义的消息框!");
customMsg
.setIconPixmap(QPixmap(":/head23.jpg"));
customMsg
.exec();
/*
* static在函数结束时不会被回收的
static QMessageBox mb
;
mb
.show();
QMessageBox
* qb
= new QMessageBox
;
qb
->show();
* */
if(customMsg
.clickedButton() == pyes
)
{
ui
->label
->setText("Custom/yes");
}
else if(customMsg
.clickedButton() == pno
)
{
ui
->label
->setText("Custom/no");
}
else if(customMsg
.clickedButton() == pcancel
)
{
ui
->label
->setText("Custom/cancel");
}
}
关于qt消息框aboutQt
void MyDialog
::on_aboutQTMsg_clicked()
{
ui
->label
->setText("AboutQt Message Box");
QMessageBox
::aboutQt(this,"终于完事了!!");
}
关于消息框about
void MyDialog
::on_aboutMsg_clicked()
{
ui
->label
->setText("About Message Box");
QMessageBox
::about(this,"About消息框","看到这里你还好么?");
}
输入对话框getText;getInt;getDouble
void MyWidget
::on_pushButton_4_clicked()
{
bool ok
;
QString string
= QInputDialog
::getText(this, tr("输入字符串对话框"),
tr("请输入用户名:"), QLineEdit
::Normal
,tr("admin"), &ok
);
if(ok
) qDebug() << "string:" << string
;
int value1
= QInputDialog
::getInt(this, tr("输入整数对话框"),
tr("请输入-1000到1000之间的数值"), 100, -1000, 1000, 10, &ok
);
if(ok
) qDebug() << "value1:" << value1
;
double value2
= QInputDialog
::getDouble(this, tr("输入浮点数对话框"),
tr("请输入-1000到1000之间的数值"), 0.00, -1000, 1000, 2, &ok
);
if(ok
) qDebug() << "value2:" << value2
;
QStringList items
;
items
<< tr("条目1") << tr("条目2");
QString item
= QInputDialog
::getItem(this, tr("输入条目对话框"),
tr("请选择或输入一个条目"), items
, 0, true, &ok
);
if(ok
) qDebug() << "item:" << item
;
}
向导对话框
void MyWidget
::on_pushButton_8_clicked()
{
QWizard
wizard(this);
wizard
.setWindowTitle(tr("向导对话框"));
wizard
.addPage(createPage1());
wizard
.addPage(createPage2());
wizard
.addPage(createPage3());
wizard
.exec();
}
QWizardPage
* MyWidget
::createPage1()
{
QWizardPage
*page
= new QWizardPage
;
page
->setTitle(tr("介绍"));
return page
;
}
QWizardPage
* MyWidget
::createPage2()
{
QWizardPage
*page
= new QWizardPage
;
page
->setTitle(tr("用户选择信息"));
return page
;
}
QWizardPage
* MyWidget
::createPage3()
{
QWizardPage
*page
= new QWizardPage
;
page
->setTitle(tr("结束"));
return page
;
}
进度对话框
void MyWidget
::on_pushButton_6_clicked()
{
QProgressDialog
dialog(tr("文件复制进度"), tr("取消"), 0, 50000, this);
dialog
.setWindowTitle(tr("进度对话框"));
dialog
.setWindowModality(Qt
::WindowModal
);
dialog
.show();
for(int i
=0; i
<50000; i
++) {
dialog
.setValue(i
);
QCoreApplication
::processEvents();
if(dialog
.wasCanceled()) break;
}
dialog
.setValue(50000);
qDebug() << tr("复制结束!");
}
20.文本框的选择toPlainText();toHtml();text();currentText()
QPlainTextEdit 多行简单文本框用
toPlainText();
QTextEdit富文本框
,简单文本用
toPlainText(),富文本用
toHtml().
QLineEdit(行编辑时
) 时用
text().
currentText()保存组合框当前文本
|setValue() 给函数赋值
|value() 值
isChecked() 点击选择
void MainWindow
::on_pushButton_combo_clicked()
{
ui
->label_combo
->setText(ui
->comboBox
->currentText());
ui
->label_com2
->setText(ui
->comboBox
->currentText().append("aaaaaaaaa"));
}
void MainWindow
::on_pushButton_radiobutton_clicked()
{
if(ui
->radioButton
->isChecked())
{
ui
->label_radio
->setText("falm");
}else if(ui
->radioButton_2
->isChecked())
ui
->label_radio
->setText("man");
}
21.控件样式动态更改
ui
->frame
->setFrameShape(QFrame
::Box
);
ui
->frame
->setFrameShadow(QFrame
::Sunken
);
ui
->frame
->setLineWidth(5);
ui
->frame
->setMidLineWidth(10);
frame控件
22.字体更改
QFont font
;
font
.setFamily("华文行楷");
font
.setPointSize(20);
font
.setBold(true);
font
.setItalic(true);
ui
->label
->setFont(font
);
QString string
= tr("标题太长,需要进行省略!");
QString str
= ui
->label
->fontMetrics().elidedText(string
, Qt
::ElideRight
, 180);
ui
->label
->setText(str
);
23.label中添加动画以及图片
动态添加label
QLabel
*label
= new QLabel(this);
label
->setText(tr("hello Qt!"));
label
->move(100,50);
ui
->label
->setPixmap(QPixmap("D:/qtwenjian/src/03/3-8/logo.png"));
QMovie
*movie
= new QMovie("D:/qtwenjian/src/03/3-8/donghua.gif");
ui
->label
->setMovie(movie
);
movie
->start();
按键进行隐藏窗口
void MyWidget
::on_pushButton_toggled(bool checked
)
{
ui
->textEdit
->setVisible(checked
);
if(checked
) ui
->pushButton
->setText(tr("隐藏可扩展窗口"));
else ui
->pushButton
->setText(tr("显示可扩展窗口"));
}
24.lcdNumber显示系统时间
头文件定义
#include <QDateTime>
QTimer
*pTimer
;
QDateTime dateTime
;
MyWidget
::MyWidget(QWidget
*parent
) :
QWidget(parent
),
ui(new Ui
::MyWidget
)
{
ui
->setupUi(this);
pTimer
=new QTimer();
connect(pTimer
, SIGNAL(timeout()), this, SLOT(showtime()));
pTimer
->start(500);
}
void MyWidget
::showtime()
{
dateTime
=QDateTime
::currentDateTime();
ui
->lcdNumber
->resize(100,50);
ui
->lcdNumber
->setDigitCount(8);
QString timestr
= dateTime
.toString("hh:mm:ss");
ui
->lcdNumber
->display(timestr
);
}
lcdNumber位移
Widget
::Widget(QWidget
*parent
) :
QWidget(parent
),
ui(new Ui
::Widget
)
{
ui
->setupUi(this);
id1
= startTimer(1000);
id2
= startTimer(1500);
id3
= startTimer(2200);
QTimer
*timer
= new QTimer(this);
connect(timer
, &QTimer
::timeout
, this, &Widget
::timerUpdate
);
timer
->start(1000);
qsrand(QTime(0, 0, 0).secsTo(QTime
::currentTime()));
QTimer
::singleShot(10000, this, &Widget
::close
);
}
Widget
::~Widget()
{
delete ui
;
}
void Widget
::timerEvent(QTimerEvent
*event
)
{
if (event
->timerId() == id1
) {
qDebug() << "timer1";
}
else if (event
->timerId() == id2
) {
qDebug() << "timer2";
}
else {
qDebug() << "timer3";
}
}
void Widget
::timerUpdate()
{
QTime time
= QTime
::currentTime();
QString text
= time
.toString("hh:mm");
if((time
.second() % 2) == 0) text
[2]=' ';
ui
->lcdNumber
->display(text
);
int rand
= qrand() % 200;
ui
->lcdNumber
->move(rand
, rand
);
}
25.菜单栏设置
QMenu
*editMenu
= ui
->menuBar
->addMenu(tr("编辑(&E)"));
QAction
*action_Open
= editMenu
->addAction(
QIcon("此处添加图标地址"), tr("打开文件(&O)"));
action_Open
->setShortcut(QKeySequence("Ctrl+O"));
ui
->mainToolBar
->addAction(action_Open
);
QActionGroup
*group
= new QActionGroup(this);
QAction
*action_L
= group
->addAction(tr("左对齐(&L)"));
action_L
->setCheckable(true);
QAction
*action_R
= group
->addAction(tr("右对齐(&R)"));
action_R
->setCheckable(true);
QAction
*action_C
= group
->addAction(tr("居中(&C)"));
action_C
->setCheckable(true);
action_L
->setChecked(true);
editMenu
->addSeparator();
editMenu
->addAction(action_L
);
editMenu
->addAction(action_R
);
editMenu
->addAction(action_C
);
QToolButton
*toolBtn
= new QToolButton(this);
toolBtn
->setText(tr("颜色"));
QMenu
*colorMenu
= new QMenu(this);
colorMenu
->addAction(tr("红色"));
colorMenu
->addAction(tr("绿色"));
toolBtn
->setMenu(colorMenu
);
toolBtn
->setPopupMode(QToolButton
::MenuButtonPopup
);
ui
->mainToolBar
->addWidget(toolBtn
);
QSpinBox
*spinBox
= new QSpinBox(this);
ui
->mainToolBar
->addWidget(spinBox
);
ui
->statusBar
->showMessage(tr("欢迎使用多文档编辑器"), 2000);
QLabel
*permanent
= new QLabel(this);
permanent
->setFrameStyle(QFrame
::Box
| QFrame
::Sunken
);
permanent
->setText("www.qter.org");
ui
->statusBar
->addPermanentWidget(permanent
);
}
MainWindow
::~MainWindow()
{
delete ui
;
}
void MainWindow
::on_action_New_triggered()
{
QTextEdit
*edit
= new QTextEdit(this);
QMdiSubWindow
*child
= ui
->mdiArea
->addSubWindow(edit
);
child
->setWindowTitle(tr("多文档编辑器子窗口"));
child
->show();
}
void MainWindow
::on_action_Dock_triggered()
{
ui
->dockWidget
->show();
}
26.文本处理
富文本框处理TextEdit
富文本是可以支持多格式输入:字体颜色、表格、图片等。 头文件#include
QTextDocument
*document
= ui
->textEdit
->document();
QTextFrame
*rootFrame
= document
->rootFrame();
QTextFrameFormat format
;
format
.setBorderBrush(Qt
::red
);
format
.setBorder(3);
rootFrame
->setFrameFormat(format
);
QTextFrameFormat frameFormat
;
frameFormat
.setBackground(Qt
::lightGray
);
frameFormat
.setMargin(10);
frameFormat
.setPadding(5);
frameFormat
.setBorder(2);
frameFormat
.setBorderStyle(QTextFrameFormat
::BorderStyle_Dotted
);
QTextCursor cursor
= ui
->textEdit
->textCursor();
cursor
.insertFrame(frameFormat
);
QAction
*action_textFrame
= new QAction(tr("框架"), this);
connect(action_textFrame
, &QAction
::triggered
, this, &MainWindow
::showTextFrame
);
ui
->mainToolBar
->addAction(action_textFrame
);
QAction
*action_textBlock
= new QAction(tr("文本块"), this);
connect(action_textBlock
, &QAction
::triggered
, this, &MainWindow
::showTextBlock
);
QAction
*action_font
= new QAction(tr("字体"), this);
action_font
->setCheckable(true);
connect(action_font
, &QAction
::toggled
, this, &MainWindow
::setTextFont
);
}
void MainWindow
::showTextFrame()
{
QTextDocument
*document
= ui
->textEdit
->document();
QTextFrame
*frame
= document
->rootFrame();
QTextFrame
::iterator it
;
for (it
= frame
->begin(); !(it
.atEnd()); ++it
) {
QTextFrame
*childFrame
= it
.currentFrame();
QTextBlock childBlock
= it
.currentBlock();
if (childFrame
)
qDebug() << "frame";
else if (childBlock
.isValid())
qDebug() << "block:" << childBlock
.text();
}
}
void MainWindow
::showTextBlock()
{
QTextDocument
*document
= ui
->textEdit
->document();
QTextBlock block
= document
->firstBlock();
for (int i
= 0; i
< document
->blockCount(); i
++) {
qDebug() << tr("文本块%1,文本块首行行号为:%2,长度为:%3,内容为:")
.arg(i
).arg(block
.firstLineNumber()).arg(block
.length())
<< block
.text();
block
= block
.next();
}
}
void MainWindow
::setTextFont(bool checked
)
{
if(checked
){
QTextCursor cursor
= ui
->textEdit
->textCursor();
QTextBlockFormat blockFormat
;
blockFormat
.setAlignment(Qt
::AlignCenter
);
cursor
.insertBlock(blockFormat
);
QTextCharFormat charFormat
;
charFormat
.setBackground(Qt
::lightGray
);
charFormat
.setForeground(Qt
::blue
);
charFormat
.setFont(QFont(tr("宋体"), 12, QFont
::Bold
, true));
charFormat
.setFontUnderline(true);
cursor
.setCharFormat(charFormat
);
cursor
.insertText(tr("测试字体"));
}
else{}
}
使用拖放来打开文本
#include <QDragEnterEvent>
#include <QUrl>
#include <QFile>
#include <QTextStream>
#include <QMimeData>
void MainWindow
::dragEnterEvent(QDragEnterEvent
*event
)
{
if(event
->mimeData()->hasUrls())
event
->acceptProposedAction();
else event
->ignore();
}
void MainWindow
::dropEvent(QDropEvent
*event
)
{
const QMimeData
*mimeData
= event
->mimeData();
if(mimeData
->hasUrls()){
QList
<QUrl
> urlList
= mimeData
->urls();
QString fileName
= urlList
.at(0).toLocalFile();
if(!fileName
.isEmpty()){
QFile
file(fileName
);
if(!file
.open(QIODevice
::ReadOnly
)) return;
QTextStream
in(&file
);
ui
->textEdit
->setText(in
.readAll());
}
}
}
设置图片拖拽
setAcceptDrops(true
);
QLabel
*label
= new
QLabel(this
);
QPixmap
pix("../imagedragdrop/logo.png");
label
->setPixmap(pix
);
label
->resize(pix
.size());
label
->move(100,100);
label
->setAttribute(Qt
::WA_DeleteOnClose
);
void MainWindow
::mousePressEvent(QMouseEvent
*event
)
{
QLabel
*child
= static_cast
<QLabel
*>(childAt(event
->pos()));
if(!child
->inherits("QLabel")) return;
QPixmap pixmap
= *child
->pixmap();
QByteArray itemData
;
QDataStream
dataStream(&itemData
, QIODevice
::WriteOnly
);
dataStream
<< pixmap
<< QPoint(event
->pos() - child
->pos());
QMimeData
*mimeData
= new QMimeData
;
mimeData
->setData("myimage/png", itemData
);
QDrag
*drag
= new
QDrag(this
);
drag
->setMimeData(mimeData
);
drag
->setPixmap(pixmap
);
drag
->setHotSpot(event
->pos() - child
->pos());
QPixmap tempPixmap
= pixmap
;
QPainter painter
;
painter
.begin(&tempPixmap
);
painter
.fillRect(pixmap
.rect(), QColor(127, 127, 127, 127));
painter
.end();
child
->setPixmap(tempPixmap
);
if (drag
->exec(Qt
::CopyAction
| Qt
::MoveAction
, Qt
::CopyAction
)
== Qt
::MoveAction
)
child
->close();
else {
child
->show();
child
->setPixmap(pixmap
);
}
}
void MainWindow
::dragEnterEvent(QDragEnterEvent
*event
)
{
if (event
->mimeData()->hasFormat("myimage/png")) {
event
->setDropAction(Qt
::MoveAction
);
event
->accept();
} else {
event
->ignore();
}
}
void MainWindow
::dragMoveEvent(QDragMoveEvent
*event
)
{
if (event
->mimeData()->hasFormat("myimage/png")) {
event
->setDropAction(Qt
::MoveAction
);
event
->accept();
} else {
event
->ignore();
}
}
void MainWindow
::dropEvent(QDropEvent
*event
)
{
if (event
->mimeData()->hasFormat("myimage/png")) {
QByteArray itemData
= event
->mimeData()->data("myimage/png");
QDataStream
dataStream(&itemData
, QIODevice
::ReadOnly
);
QPixmap pixmap
;
QPoint offset
;
dataStream
>> pixmap
>> offset
;
QLabel
*newLabel
= new
QLabel(this
);
newLabel
->setPixmap(pixmap
);
newLabel
->resize(pixmap
.size());
newLabel
->move(event
->pos() - offset
);
newLabel
->show();
newLabel
->setAttribute(Qt
::WA_DeleteOnClose
);
event
->setDropAction(Qt
::MoveAction
);
event
->accept();
} else {
event
->ignore();
}
}
设置打印转换格式pdf
void MainWindow
::doPrint()
{
QPrinter printer
;
QPrintDialog
dlg(&printer
, this
);
if (ui
->textEdit
->textCursor().hasSelection())
dlg
.addEnabledOption(QAbstractPrintDialog
::PrintSelection
);
if (dlg
.exec() == QDialog
::Accepted
) {
ui
->textEdit
->print(&printer
);
}
}
void MainWindow
::doPrintPreview()
{
QPrinter printer
;
QPrintPreviewDialog
preview(&printer
, this
);
connect(&preview
, &QPrintPreviewDialog
::paintRequested
,
this
, &MainWindow
::printPreview
);
preview
.exec();
}
生成pdf格式
void MainWindow
::createPdf()
{
QString fileName
= QFileDialog
::getSaveFileName(this
, tr("导出PDF文件"),
QString(), "*.pdf");
if (!fileName
.isEmpty()) {
if (QFileInfo(fileName
).suffix().isEmpty())
fileName
.append(".pdf");
QPrinter printer
;
printer
.setOutputFormat(QPrinter
::PdfFormat
);
printer
.setOutputFileName(fileName
);
ui
->textEdit
->print(&printer
);
}
}
27正则表达式
主要用来限制对话框的输入键盘限制
宏:?代表禁止输入±,最大数字200000,或者1开头,后面最多5位,此后同理,1
-9开头,此后最多4为。
QRegExp
AIRport(NM_REG_AIRPORT
);
QValidator
*validatorAIRport
= new
QRegExpValidator(AIRport
);
ui
.lineEdit
->setValidator(validatorAIRport
);
ui
.lineEdit
->setToolTip(QString
::fromLocal8Bit("输入完别忘了点确定"));
控件提示框
ui
.lineEdit
->setToolTip(QString
::fromLocal8Bit("别瞎输入:0-200000之间,多了也不好使,输入完别忘了点确定"));
28定时器
defaulttime是我想定义的初始值。 后面界面输入数值,进行点击跳转到别的槽函数进行数字更改
此处我写于构造函数
my_time
= new QTimer(this);
my_time
->start(defaulttime
);
connect(my_time
, SIGNAL(timeout()), this, SLOT(refresh()));
void NcReadPerformanceWnd
::okButton()
{
num
= ui
.lineEdit
->text();
defaulttime
= num
.toInt();
my_time
->setInterval(defaulttime
);
}
29comBox 添加信息及其美化
ui
.comboBox
->setEditable(true);
ui
.comboBox
->setCurrentText(list
.at(0).toString());
QComboBox
*ComBox
=new QComboBox(this);
ComBox
->setGeometry(0,0,209,45);
ComBox
->addItem(tr("1小时"));
ComBox
->addItem(tr("2小时"));
ComBox
->addItem(tr("3小时"));
ComBox
->addItem(tr("4小时"));
ComBox
->setStyleSheet("QComboBox{"
"border-image:url(:/Sys/output-box.png);"
"font:黑体;"
"font-size:20px;"
"color:rgb(255,255,255);"
"background-color:transparent;"
"width:209px;"
"height:45px;"
"}"
"QComboBox::down-arrow{"
"image:url(:/Sys/btn_pulldown.png);"
"background-color:transparent;"
"width:36px;"
"height:22px;"
"right:2px;"
"}"
"QComboBox QAbstractItemView {"
"outline:0px;"
"}"
"QComboBox::drop-down {"
"subcontrol-origin: padding;"
"subcontrol-position: top right;"
"width: 36px;"
"}"
);
https://blog.csdn.net/qq_41673920/article/details/93495716
30button删除tableWidget中某一行
void NcStateTable
::deleteWidgetLine()
{
QPushButton
*btn
= (QPushButton
*)sender();
int x
= btn
->mapToParent(QPoint(0, 0)).x();
int y
= btn
->mapToParent(QPoint(0, 0)).y();
QModelIndex index
= tablewidget
->indexAt(QPoint(x
, y
));
int row
= index
.row();
tablewidget
->removeRow(row
);
}
页面删除deleteLater
当在窗口上.children可以返回当前窗口所有子类对象列表 deletelater 可以删除窗口子类对象 ,我觉得和dilete相比最大区别delete是直接删除,deletelater是发一个信号,当信号主窗口接收时删除
QObjectList objectList
= m_pSetValueWnd
.children();
for (int i
=0; i
<objectList
.size(); i
++)
{
objectList
[i
]->deleteLater();
}
extern
NcSymbolTable
* Box
;
NcSymbolTable
::NcSymbolTable(QWidget
*parent
)
: NRFWidget(parent
)
{
Box
= this;
extern NcSymbolTable
* Box
;
writeDatagram通信发送函数
//writeDatagram方法传入4个参数,分别是数据,数据大小,接收端ip,接收端端口 //如果传输成功,该方法返回传输数据的大小(字节),如果失败返回-1
tablewidget用法
ui.ForecastStrike->insertRow(ui.ForecastStrike->rowCount());//添加新一行
ui
.tableWidget
->item(count
, 0)->setText(QString("%1").arg(line
))
ui
.tableWidget
->verticalHeader()->setVisible(false);
tablewidget加按钮
QTableWidgetItem
* item
= new QTableWidgetItem();
item
->setTextAlignment(Qt
::AlignRight
| Qt
::AlignVCenter
);
ui
.tableWidget
->setItem(columnsNum
, 0, item
);
QCheckBox
* CBox
= new QCheckBox();
m_mapTableCheckbox
.insert(columnsNum
, CBox
);
CBox
->setObjectName("TableCheckBox");
ui
.tableWidget
->setCellWidget(columnsNum
, 0, CBox
);
PBuManagers
= new QPushButton(QString
::fromLocal8Bit("确认审核"));
QTableWidgetItem
* itemmm
= new QTableWidgetItem();
ui
.tableWidget
->setItem(columnsNum
, 12, itemmm
);
ui
.tableWidget
->setCellWidget(columnsNum
, 12, PBuManagers
);
connect(PBuManagers
, SIGNAL(clicked()), this, SLOT(slotsAuditInformation()));
for (it
= orcList
.begin(), count
= 0, line
= 1; it
!= orcList
.end(); it
++, count
++, line
++)
{
emit
SignalAdd(count
);
int i
= 0;
ui
.tableWidget
->setItem(count
, 0, new QTableWidgetItem());
ui
.tableWidget
->item(count
, 0)->setText(QString("%1").arg(line
));
ui
.tableWidget
->item(count
, 0)->setTextAlignment(Qt
::AlignRight
| Qt
::AlignVCenter
);
for (int j
= 0; j
< orcList
.at(0).size(); j
++)
{
ui
.tableWidget
->setItem(count
, j
+ 1, new QTableWidgetItem());
if (j
== 10)
{
ui
.tableWidget
->item(count
, j
+ 1)->setBackground(QColor(orcList
.at(count
).at(j
).toInt()));
ui
.tableWidget
->item(count
, j
+ 1)->setData(Qt
::UserRole
, orcList
.at(count
).at(j
).toInt());
}
else if (j
== 9 || j
== 8)
{
QString strText
= (orcList
.at(count
).at(j
).toInt() == 1) ? QString
::fromLocal8Bit("是") : QString
::fromLocal8Bit("否");
ui
.tableWidget
->item(count
, j
+ 1)->setText(strText
);
}
else
{
ui
.tableWidget
->item(count
, j
+ 1)->setText(orcList
.at(count
).at(j
).toString());
}
}
}
二 页面美化设置
QPalette palette1
= ui
->pushButton
->palette();
palette1
.setColor(QPalette
::ButtonText
, Qt
::red
);
palette1
.setColor(QPalette
::Button
, Qt
::green
);
ui
->pushButton
->setPalette(palette1
);
ui
->spinBox
->setDisabled(true);
QPalette palette2
= ui
->spinBox
->palette();
palette2
.setColor(QPalette
::Disabled
,QPalette
::Base
,Qt
::blue
);
ui
->spinBox
->setPalette(palette2
);
1. 伪状态(鼠标放在页面上的状态)
2.屏蔽窗口
QPixmap pix
;
pix
.load(":/image/yafeilinux.png");
resize(pix
.size());
setMask(pix
.mask());
3.页面透明度
setWindowOpacity(0.5);
窗口部件提升
Qt学习:将ui界面中的默认控件提升为自定义类 https://blog.csdn.net/wzj0808/article/details/96102352
更改list中.at特定位置中的值 [ ]
[][]相当于at,at属于const,不可修改值
QVariant temp
= QVariant(QString
::fromLocal8Bit("是"));
orcList
[z
][t
] = temp
;
定时器周期
关键点在于我后面虽然对初始值进行了传值处理,但是不好使。我只能刷新定时器周期,才可以正常运行
.其他未整理
//3.关联两个对象 connect 四个参数:1. 发送信号的对象 2. 发送的信号 3. 接受者所在的位置 4.对应处理的槽函数
connect(ui->btn_1,SIGNAL(clicked()),this,SLOT(btn_showHello_slot()));
字符串转换 toint //setItem添加一个单元格 //toLocal8Bit把字符串转换成字节数组 push_back//结尾添加 push_front//头添加 setValue() //给函数赋值 value() //值
main函数创建页面
QWidget widget
;
widget
.resize(400, 300);
widget
.move(200, 100);
widget
.show();
常用插件函数
setItem(1,num)//可以对数据进行添加,用了combox里,但是是在原本有数据情况下, 没有数据用 addItem(name)
常用MIME类型数据处理函数
settoolTep函数
鼠标悬停显示气泡内容 用法
三 qt小程序
1.读取xml
void NcMissileComputing
::readXml(char* fileName
)
{
QFile
fp(QString
::fromLocal8Bit(fileName
));
QXmlStreamReader reader
;
if (!fp
.open(QFile
::ReadOnly
))
{
NRFGuiUtil
::ShowPromptMessage(NULL, "警告!", QString
::fromLocal8Bit("%1文件打开失败").arg(fileName
));
}
reader
.setDevice(&fp
);
while (!reader
.atEnd())
{
if (reader
.name() == QString
::fromLocal8Bit("LocationGunTruckX"))
{
dPosX
= reader
.readElementText().toDouble();
}
else if (reader
.name() == QString
::fromLocal8Bit("LocationGunTruckY"))
{
dPosY
= reader
.readElementText().toDouble();
}
reader
.readNext();
}