窗口部件
#include<QtWidgets>
int main(int argc,char *argv[])
{
QApplication a(argc,argv);
//新建QWidget类对象,无父类,单独窗口
QWidget *widget =new QWidget();
//设置窗口标题
widget->setWindowTitle(QObject::tr("我是Widget"));
//新建Labal对象,单独窗口
QLabel *label=new QLabel();
label->setWindowTitle(QObject::tr("我是Label"));
//设置Label大小
label->resize(180,20);
//新建Label2对象,指定Widget为父窗口
QLabel *label2=new QLabel(widget);
label2->setWindowTitle(QObject::tr("我不是独立窗口,我是Widget子部件"));
label2->resize(250,20);
label->show();
widget->show();
int ret=a.exec();
delete label;
delete widget;
return ret;
}
非模态对话框建立
#include "mywidget.h"
#include "ui_mywidget.h"
#include<QDialog>
MyWidget::MyWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::MyWidget)
{
//设置myWidget为父窗口
ui->setupUi(this);
//建立Dialog
QDialog *dialog=new QDialog(this);
dialog->show();
}
MyWidget::~MyWidget()
{
delete ui;
}
模态对话框
#include "mywidget.h"
#include "ui_mywidget.h"
#include<QDialog>
MyWidget::MyWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::MyWidget)
{
//设置myWidget为父窗口
ui->setupUi(this);
//建立Dialog
QDialog dialog(this);
//调用exec()函数
dialog.exec();
}
MyWidget::~MyWidget()
{
delete ui;
}
Show()建立模态对话框
#include "mywidget.h"
#include "ui_mywidget.h"
#include<QDialog>
MyWidget::MyWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::MyWidget)
{
//设置myWidget为父窗口
ui->setupUi(this);
//建立Dialog
QDialog *dialog=new QDialog(this);
dialog->setModal(true);
dialog->show();
}
MyWidget::~MyWidget()
{
delete ui;
}
手动关联信号与槽
#include "mywidget.h"
#include "ui_mywidget.h"
#include<QDialog>
MyWidget::MyWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::MyWidget)
{
ui->setupUi(this);
//发射信号的对象,发射的信号,接收信号的对象,要是执行的槽
connect(ui->showChildButton,&QPushButton::clicked,this,&MyWidget::showChildDialog);
}
void MyWidget::showChildDialog()
{
QDialog *dialog=new QDialog(this);
dialog->show();
}
MyWidget::~MyWidget()
{
delete ui;
}
自定义对话框的退出与进入
#include "mywidget.h"
#include "ui_mywidget.h"
#include"mydialog.h"
#include<QDialog>
MyWidget::MyWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::MyWidget)
{
ui->setupUi(this);
//发射信号的对象,发射的信号,接收信号的对象,要是执行的槽
connect(ui->showChildButton,&QPushButton::clicked,this,&MyWidget::showChildDialog);
}
void MyWidget::showChildDialog()
{
QDialog *dialog=new QDialog(this);
dialog->show();
}
MyWidget::~MyWidget()
{
delete ui;
}
void MyWidget::on_pushButton_clicked()
{
//隐藏主界面myWidget
close();
//新建MyDialog对象
MyDialog dlg;
if(dlg.exec()==QDialog::Accepted)
{
show();
}
}
颜色对话框
void MyWidget::on_pushButton_3_clicked()
{
//参数:设置初始颜色,指定父窗口,设置对话框标题
QColor color=QColorDialog::getColor(Qt::red,this,tr("颜色对话框"),QColorDialog::ShowAlphaChannel);
qDebug()<<"color:"<<color;
}
void MyWidget::on_pushButton_3_clicked()
{
//创建对象
QColorDialog dialog;
//显示alpha
dialog.setOption(QColorDialog::ShowAlphaChannel);
// dialog.exec();
//获取当前颜色
QColor color = dialog.getColor();
qDebug()<<"color:"<<color;
}
文件对话框
void MyWidget::on_pushButton_4_clicked()
{
//参数:指定父窗口,设置对话框标题,指定默认打开的目标路径,设置文件类型的过滤器
QString fileName=QFileDialog::getOpenFileName(this,tr("文件对话框"),"C:",tr("图片文件(*png *jpg);;文本文件(*txt)"));
qDebug()<<"fileName:"<<fileName;
}
字体对话框
void MyWidget::on_pushButton_5_clicked()
{
//bool值判断单击
bool ok;
//获取选择的字体
QFont font=QFontDialog::getFont(&ok,this);
if(ok==true)
{
ui->pushButton_5->setFont(font);
}
else
{
qDebug()<<tr("没有选择字体");
}
}
输入对话框
void MyWidget::on_pushButton_6_clicked()
{
bool ok;
//获取字符串
//指定父窗口,设置窗口标题,设置对话框中的标签显示文本,设置输入字符串的显示模式,设置输入框中的默认字符串,设置获取按下按钮信息的bool变量
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,2,&ok);
if(ok)
{
qDebug()<<"value1:"<<value1;
}
//获取浮点数
int value2=QInputDialog::getDouble(this,tr("输入浮点数的对话框"),tr("请输入-1000到1000之间的数值"),0.00,-1000,1000,2,&ok);
if(ok)
{
qDebug()<<"value2:"<<value2;
}
//获取条目
QStringList items;
items<<tr("条目1")<<("条目2");
QString item=QInputDialog::getItem(this,tr("输入条目对话框"),tr("请输入或选择一个条目"),items,0,true,&ok);
if(ok)
{
qDebug()<<"item:"<<item;
}
}
消息对话框
void MyWidget::on_pushButton_7_clicked()
{
//问题对话框
int ret1=QMessageBox::question(this,tr("问题对话框"),tr("你了解Qt吗?"),QMessageBox::Yes,QMessageBox::No);
if(ret1==QMessageBox::Yes)
{
qDebug()<<tr("问题!");
}
//提示对话框
int ret2=QMessageBox::information(this,tr("提示对话框"),tr("这是Qt书籍!"),QMessageBox::Ok);
if(ret2==QMessageBox::Ok)
{
qDebug()<<tr("提示!");
}
//警告对话框
int ret3=QMessageBox::warning(this,tr("警告对话框"),tr("不能提前结束!"),QMessageBox::Abort);
if(ret3==QMessageBox::Abort)
{
qDebug()<<tr("警告!");
}
//错误对话框
int ret4=QMessageBox::critical(this,tr("严重错误对话框"),tr("发现了严重错误,需关闭所有文件"),QMessageBox::YesAll);
if(ret4==QMessageBox::YesAll)
{
qDebug()<<tr("错误!");
}
//关于对话框
QMessageBox::about(this,tr("关于对话框"),tr("guanyu"));
}
进度对话框
void MyWidget::on_pushButton_8_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;
}
}
//显示100%
dialog.setValue(50000);
qDebug()<<tr("复制结束!");
}
错误信息对话框
需引入QErrorMessage
类并添加相应对象
void MyWidget::on_pushButton_9_clicked()
{
errordlg->setWindowTitle(tr("错误信息对话框"));
errordlg->showMessage(tr("这里是出错信息!"));
}
向导对话框
按添加顺序线性显示
private:
Ui::MyWidget *ui;
QWizardPage *creatPage1();
QWizardPage *creatPage2();
QWizardPage *creatPage3();
QWizardPage * MyWidget::creatPage1()
{
QWizardPage *page=new QWizardPage;
page->setTitle(tr("介绍"));
return page;
}
QWizardPage * MyWidget::creatPage2()
{
QWizardPage *page=new QWizardPage;
page->setTitle(tr("用户信息"));
return page;
}
QWizardPage * MyWidget::creatPage3()
{
QWizardPage *page=new QWizardPage;
page->setTitle(tr("结束"));
return page;
}
void MyWidget::on_pushButton_10_clicked()
{
QWizard wizard(this);
wizard.setWindowTitle(tr("向导对话框"));
//添加向导页面
wizard.addPage(creatPage1());
wizard.addPage(creatPage2());
wizard.addPage(creatPage3());
wizard.exec();
}
按钮与文本框部件
MyWidget::MyWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::MyWidget)
{
ui->setupUi(this);
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);
ui->pushButton->setText(tr("&nihao"));
ui->pushButton_2->setText(tr("帮助(&H)"));
ui->pushButton_3->setText("z&oom");
QMenu *menu=new QMenu(this);
ui->pushButton_3->setMenu(menu);
}
MyWidget::~MyWidget()
{
delete ui;
}
void MyWidget::on_pushButton_toggled(bool checked)
{
//按钮是否处于被按下状态
qDebug()<<tr("按钮是否按下:")<<checked;
}
行编辑器
#include<QString>
#include<QCompleter>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//新建验证器
QValidator *validator=new QIntValidator(100,999,this);
ui->lineEdit_3->setValidator(validator);
//自动补全
QStringList wordList;
wordList<<"Qt"<<"Qt Creater"<<tr("你好");
//新建自动补全器
QCompleter *completer=new QCompleter(wordList,this);
//设置大小写不敏感
completer->setCaseSensitivity(Qt::CaseInsensitive);
ui->lineEdit_4->setCompleter(completer);
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_lineEdit_2_returnPressed()
{
//让lineEdit3获得焦点
ui->label_3->setFocus();
qDebug()<<ui->lineEdit_2->text();
qDebug()<<ui->lineEdit_2->displayText();
}
基本布局
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//新建水平布局管理器
QHBoxLayout *layout =new QHBoxLayout;
//添加字体选择框
layout->addWidget(ui->fontComboBox);
//添加文本编辑框
layout->addWidget(ui->textEdit);
//设置部件间的间隔
layout->setSpacing(50);
//设置布局管理器到边界的距离
layout->setContentsMargins(0,0,50,100);
//设置布局
setLayout(layout);
}
栅格布局
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//新建栅格布局
QGridLayout *layout=new QGridLayout;
//从0行0列开始,占据1行2列
layout->addWidget(ui->fontComboBox,0,0,1,2);
layout->addWidget(ui->pushButton,0,2,1,1);
layout->addWidget(ui->textEdit,1,0,1,3);
setLayout(layout);
}
可拓展窗口
void Widget::on_pushButton_toggled(bool checked)
{
//设置文本编辑器显示与隐藏
ui->textEdit->setVisible(checked);
if(checked)
{
ui->pushButton->setText(tr("隐藏可拓展窗口"));
}
else
{
ui->pushButton->setText(tr("显示可拓展窗口"));
}
}
添加菜单
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
//添加编辑菜单
QMenu *editMenu =ui->menuBar->addMenu(tr("编辑(&E)"));
//添加打开菜单
QAction *action_Open=editMenu->addAction(QIcon(":/image/images/广东.jpg"),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)"));
//设置checkable为true
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
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);
//向工具栏添加QToolButton按钮
ui->mainToolBar->addWidget(toolBtn);
//创建QSpinBox
QSpinBox *spinBox=new QSpinBox(this);
//向工具栏添加QSpinBox
ui->mainToolBar->addWidget(spinBox);
文本编辑子窗口
void MainWindow::on_action_New_triggered()
{
//新建文本编辑器部件
QTextEdit *edit =new QTextEdit(this);
//使用QMdiArea类的addSubWindow()函数创建子窗口,以文本编辑器为中心部件
QMdiSubWindow *child=ui->mdiArea->addSubWindow(edit);
child->setWindowTitle("多文档编辑子窗口");
child->show();
}
设置临时和永久状态栏
//状态栏添加
//显示临时信息,显示2000毫秒
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);
自定义菜单&行编辑器文本与主窗口文本转化
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include"myaction.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
//添加菜单并加入action
MyAction *action=new MyAction;
QMenu *editMenu=ui->menuBar->addMenu(tr("编辑(&E)"));
editMenu->addAction(action);
connect(action,SIGNAL(getText(QString)),this,SLOT(setText(QString)));
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::setText(const QString &string)
{
ui->textEdit->setText(string);
}
#include "myaction.h"
#include<QLineEdit>
#include<QSplitter>
#include<QLabel>
MyAction::MyAction(QObject * parent):
QWidgetAction(parent)
{
//创建行编辑器
lineEdit=new QLineEdit;
lineEdit->resize(200,200);
//将行编辑器的按下回车键信号与发送文本槽关联
connect(lineEdit,&QLineEdit::returnPressed,this,&MyAction::sendText);
lineEdit->show();
}
QWidget*MyAction::createdWidget(QWidget*parent)
{
//判断父部件是否为菜单或者工具栏
//是,创建子部件,返回子部件
//不是,直接返回0
if(parent->inherits("QMenu")||parent->inherits("QToolBar"))
{
QSplitter *splitter=new QSplitter(parent);
QLabel *label=new QLabel;
label->setText(tr("插入文本"));
splitter->addWidget(label);
splitter->addWidget(lineEdit);
return splitter;
}
return 0;
}
void MyAction::sendText()
{
//发射信号,将行编辑器中的内容发射出去
emit getText(lineEdit->text());
//清空行编辑器里的内容
lineEdit->clear();
}
富文本编辑器与文本块
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QTextFrame>
#include<QDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
//获取文档对象
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_font=new QAction(tr("字体"),this);
//设置动作可被选中
action_font->setCheckable(true);
connect(action_font,&QAction::toggled,this,&MainWindow::setTextFont);
ui->mainToolBar->addAction(action_font);
}
void MainWindow::showTextFrame()
{
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);
//字符格式
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
{
}
}
MainWindow::~MainWindow()
{
delete ui;
}
插入表格列表图片
QAction *action_textTable=new QAction(tr("表格"),this);
QAction *action_textList=new QAction(tr("列表"),this);
QAction *action_textImage=new QAction(tr("图片"),this);
connect(action_textTable,&QAction::triggered,this,&MainWindow::insertTable);
connect(action_textList,&QAction::triggered,this,&MainWindow::insertList);
connect(action_textImage,&QAction::triggered,this,&MainWindow::insertImage);
ui->mainToolBar->addAction(action_textTable);
ui->mainToolBar->addAction(action_textList);
ui->mainToolBar->addAction(action_textImage);
void MainWindow::insertTable()
{
QTextCursor cursor=ui->textEdit->textCursor();
//表格格式
QTextTableFormat format;
//表格外边白
format.setCellSpacing(2);
//表格内边白
format.setCellPadding(10);
//插入2行2列的表格
cursor.insertTable(2,2,format);
}
void MainWindow::insertList()
{
//列表格式
QTextListFormat format;
//数字编号
format.setStyle(QTextListFormat::ListDecimal);
ui->textEdit->textCursor().insertList(format);
}
void MainWindow::insertImage()
{
//图片格式
QTextImageFormat format;
format.setName("...");
ui->textEdit->textCursor().insertImage(format);
}
查找与获取行列号
QAction *action_textFind=new QAction(tr("查找"),this);
connect(action_textFind,&QAction::triggered,this,&MainWindow::textFind);
ui->mainToolBar->addAction(action_textFind);
//创建对话框
findDialog=new QDialog(this);
//创建行编辑器
lineEdit=new QLineEdit(findDialog);
//创建按钮
QPushButton *btn=new QPushButton(findDialog);
btn->setText(tr("查找下一个"));
connect(btn,&QPushButton::clicked,this,&MainWindow::findNext);
//创建垂直布局管理器
QVBoxLayout *layout=new QVBoxLayout;
//添加部件
layout->addWidget(lineEdit);
layout->addWidget(btn);
//使用布局管理器
findDialog->setLayout(layout);
//查找文本
void MainWindow::textFind()
{
findDialog->show();
}
//查找下一个
void MainWindow::findNext()
{
QString string=lineEdit->text();
//使用查找函数查找指定字符串,查找方式为向后查找
bool isfind=ui->textEdit->find(string,QTextDocument::FindBackward);
//如果查找成功,输出字符串所在行和列的编号
if(isfind)
{
qDebug()<<tr("行号:%1列号:%2")
.arg(ui->textEdit->textCursor().blockNumber())
.arg(ui->textEdit->textCursor().columnNumber());
}
}
语法高亮
#include "mysyntaxhighlighter.h"
#include<QTextEdit>
MySyntaxHighlighter::MySyntaxHighlighter(QTextDocument *parent)
:QSyntaxHighlighter(parent)
{
}
void MySyntaxHighlighter::highlightBlock(const QString &text)
{
//字符格式
QTextCharFormat myFormat;
myFormat.setFontWeight(QFont::Bold);
myFormat.setForeground(Qt::green);
QString pattern="\\bchar\\b";
//创建正则表达式类
QRegExp expression(pattern);
//从位置0开始匹配字符串
int index=text.indexOf(expression);
while (index>=0)
{
//获取所匹配字符串的长度
int length=expression.matchedLength();
//设置字符串格式
setFormat(index,length,myFormat);
//继续匹配
index=text.indexOf(expression,index+length);
}
}
拖放打开文件
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QDragEnterEvent>
#include<QUrl>
#include<QFile>
#include<QTextStream>
#include<QMimeData>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
setAcceptDrops(true);
}
void MainWindow::dragEnterEvent(QDragEnterEvent *event)
{
//数据中是否包含URL
if(event->mimeData()->hasUrls())
{
//如果是则接收动作
event->acceptProposedAction();
}
else
{
//否则忽略该事件
event->ignore();
}
}
void MainWindow::dropEvent(QDropEvent *event)
{
//获取MIME数据
const QMimeData *mimeData=event->mimeData();
//如果数据中包含URL
if(mimeData->hasUrls())
{
//获取URL列表
QList<QUrl>urlist=mimeData->urls();
//将第一个URL表示为本地文件路径
QString fileName=urlist.at(0).toLocalFile();
//如果文件路径不为空
if(!fileName.isEmpty())
{
//建立QFile对象并且以只读方式打开该文件
QFile file(fileName);
if(!file.open(QIODevice::ReadOnly))
return;
//建立文本流对象
QTextStream in(&file);
//将文件中所有内容读入编辑器
ui->textEdit->setText(in.readAll());
}
}
}
自定义拖放
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QLabel>
#include<QMouseEvent>
#include<QDragEnterEvent>
#include<QDragMoveEvent>
#include<QDropEvent>
#include<QPainter>
#include<QMimeData>
#include<QDrag>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
//设置窗口部件可以拖拽进入
setAcceptDrops(true);
QLabel *label=new QLabel(this);
QPixmap pix(":/image/image/logo.jpg");
//添加图片
label->setPixmap(pix);
//设置标签大小为图片大小
label->resize(pix.size());
label->move(100,100);
//当窗口关闭时销毁图片
label->setAttribute(Qt::WA_DeleteOnClose);
}
void MainWindow::mousePressEvent(QMouseEvent *event)
{
//第1步:获取图片
//将鼠标指针所在位置的部件强制转换为QLabel类型
QLabel *child=static_cast<QLabel*>(childAt(event->pos()));
//如果不是QLabel就直接返回
if(!child->inherits("QLabel"))
{
return ;
}
//获取QLabel中的图片
QPixmap pixmap=*child->pixmap();
//第2步:自定义MIME类型
//创建字节数组
QByteArray itemData;
//创建数据流
QDataStream dataStream(&itemData,QIODevice::WriteOnly);
//将图片信息,位置信息输入到字节数组中
dataStream<<pixmap<<QPoint(event->pos()-child->pos());
//第3步:将数据放入QMimeData中
//创建QMimeData来存放要移动的数据
QMimeData *mimeData=new QMimeData;
//将字节数组放入QMimeData中,这里的MIME类型是我们自己定义的
mimeData->setData(":/image/image/logo.jpg",itemData);
//第4步:将QMimeData数据放入QDrag中
//创建QDiag,它用来移动数据
QDrag *drag=new QDrag(this);
drag->setMimeData(mimeData);
//在移动过程中显示图片,若不设置则默认显示一个小矩形
drag->setPixmap(pixmap);
//拖动时鼠标指针的位置不变
drag->setHotSpot(event->pos()-child->pos());
//第5步:给原图片添加阴影
//使原图片添加阴影
QPixmap tempPixmap=pixmap;
//创建QPainter,用来绘制QPixmap
QPainter painter;
painter.begin(&tempPixmap);
//在图片的外接矩阵中添加一层透明的淡黑色形成阴影效果
painter.fillRect(pixmap.rect(),QColor(127,127,127,127));
painter.end();
//在移动图片的过程中,让原图片添加一层黑色阴影
child->setPixmap(tempPixmap);
//第6步:执行拖放操作
//设置拖放可以是移动和复制操作,默认是复制操作
if(drag->exec(Qt::CopyAction|Qt::MoveAction,Qt::CopyAction)==Qt::MoveAction)
{
//如果是移动操作,则拖放完成后关闭标签
child->close();
}
else
{
//如果是复制操作,则拖放完成后显示标签
child->show();
child->setPixmap(pixmap);
}
}
void MainWindow::dragEnterEvent(QDragEnterEvent *event)
{
//如果有我们定义的MIME类型的数据,则进行移动操作
if(event->mimeData()->hasFormat(":/image/image/logo.jpg"))
{
event->setDropAction(Qt::MoveAction);
event->accept();
}
else
{
event->ignore();
}
}
void MainWindow::dragMoveEvent(QDragMoveEvent *event)
{
if(event->mimeData()->hasFormat(":/image/image/logo.jpg"))
{
event->setDropAction(Qt::MoveAction);
event->accept();
}
else
{
event->ignore();
}
}
void MainWindow::dropEvent(QDropEvent *event)
{
if(event->mimeData()->hasFormat(":/image/image/logo.jpg"))
{
QByteArray itemData=event->mimeData()->data(":/image/image/logo.jpg");
QDataStream dataStream(&itemData,QIODevice::ReadOnly);
QPixmap pixmap;
QPoint offset;
//使用数据流将字节数组中的数据读入到QPixmap和QPoint变量中
dataStream>>pixmap>>offset;
//新建标签,为其添加图片,并根据图片大小设置标签大小
QLabel *newLabel=new QLabel(this);
newLabel->setPixmap(pixmap);
newLabel->resize(pixmap.size());
//让图片移动到放下的位置,不设置的话,图片会默认显示在(0,0)点即窗口左上角
newLabel->move(event->pos()-offset);
newLabel->show();
newLabel->setAttribute(Qt::WA_DeleteOnClose);
event->setDropAction(Qt::MoveAction);
event->accept();
}
else
{
event->ignore();
}
}
MainWindow::~MainWindow()
{
delete ui;
}
事件的传递
#include "mylineedit.h"
#include<QKeyEvent>
#include<QDebug>
MyLineEdit::MyLineEdit(QWidget*parent):
QLineEdit(parent)
{
}
void MyLineEdit::keyPressEvent(QKeyEvent *event)
{
qDebug()<<tr("MyLineEdit键盘按下事件");
//执行QLineEdit类的默认事件处理
QLineEdit::keyPressEvent(event);
event->ignore();
}
bool MyLineEdit::event(QEvent *event)
{
if(event->type()==QEvent::KeyPress)
{
qDebug()<<tr("MyLineEdit的event()函数");
}
//执行父类默认操作
return QLineEdit::event(event);
}
#include "widget.h"
#include "ui_widget.h"
#include"mylineedit.h"
#include<QKeyEvent>
#include<QDebug>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
lineEdit=new MyLineEdit(this);
lineEdit->move(100,100);
//为lineEdit安装事件过滤器
lineEdit->installEventFilter(this);
}
void Widget::keyPressEvent(QKeyEvent *event)
{
qDebug()<<tr("Widget键盘按下事件");
}
//事件过滤器
bool Widget::eventFilter(QObject *obj, QEvent *event)
{
if(obj==lineEdit)
{
if(event->type()==QEvent::KeyPress)
{
qDebug()<<tr("Widget的事件过滤器");
}
}
return QWidget::eventFilter(obj,event);
}
Widget::~Widget()
{
delete ui;
}
鼠标事件
#include "widget.h"
#include "ui_widget.h"
#include<QMouseEvent>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//创建光标对象
QCursor cursor;
//设置光标形状
cursor.setShape(Qt::OpenHandCursor);
setCursor(cursor);
//设置鼠标跟踪
setMouseTracking(true);
}
//鼠标按下事件
void Widget::mousePressEvent(QMouseEvent *event)
{
//如果是鼠标左键按下
if(event->button()==Qt::LeftButton)
{
QCursor cursor;
cursor.setShape(Qt::ClosedHandCursor);
//使鼠标指针暂时改变形状
QApplication::setOverrideCursor(cursor);
//获取指针位置和窗口位置的差值
offset=event->globalPos()-pos();
}
else if(event->button()==Qt::RightButton)
{
QCursor cursor(QPixmap("..."));
QApplication::setOverrideCursor(cursor);
}
}
//鼠标移动事件
void Widget::mouseMoveEvent(QMouseEvent *event)
{
if(event->buttons()&Qt::LeftButton)
{
QPoint temp;
temp=event->globalPos()-offset;
//窗口移动量=鼠标指针-当前位置
move(temp);
}
}
//鼠标释放事件
void Widget::mouseReleaseEvent(QMouseEvent *event)
{
//没有用到event参数
Q_UNUSED(event);
//恢复鼠标形状
QApplication::restoreOverrideCursor();
}
//鼠标双击事件
void Widget::mouseDoubleClickEvent(QMouseEvent *event)
{
if(event->button()==Qt::LeftButton)
{
//如果现在不是全屏
if(windowState()!=Qt::WindowFullScreen)
{
setWindowState(Qt::WindowFullScreen);
}
else
{
setWindowState(Qt::WindowNoState);
}
}
}
//滚轮事件
void Widget::wheelEvent(QWheelEvent *event)
{
//当滚轮远离使用者时
if(event->delta()>0)
{
//放大
ui->textEdit->zoomIn();
}
else
{
ui->textEdit->zoomOut();
}
}
Widget::~Widget()
{
delete ui;
}
键盘事件1
#include "widget.h"
#include "ui_widget.h"
#include<QKeyEvent>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
}
//键盘按下事件
void Widget::keyPressEvent(QKeyEvent *event)
{
//是否按下ctrl键
if(event->modifiers()==Qt::ControlModifier)
{
if(event->key()==Qt::Key_M)
{
setWindowState(Qt::WindowMaximized);
}
else
{
QWidget::keyPressEvent(event);
}
}
}
//按键释放事件
void Widget::keyReleaseEvent(QKeyEvent *event)
{
}
Widget::~Widget()
{
delete ui;
}
键盘事件2
#include "widget.h"
#include "ui_widget.h"
#include<QKeyEvent>
#include<QDebug>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//使主界面获得焦点
setFocus();
keyUp=false;
keyLeft=false;
move=false;
}
//键盘按下事件
void Widget::keyPressEvent(QKeyEvent *event)
{
if(event->key()==Qt::Key_Up)
{
if(event->isAutoRepeat())
{
return ;
}
keyUp=true;
}
else if(event->key()==Qt::Key_Left)
{
if(event->isAutoRepeat())
{
return;
}
keyLeft=true;
}
}
//按键释放事件
void Widget::keyReleaseEvent(QKeyEvent *event)
{
if(event->key()==Qt::Key_Up)
{
if(event->isAutoRepeat())
{
return ;
}
keyUp=false;
if(move)
{
//如果完成了移动设为false
move=false;
return;
}
//如果向左方向键已经按下且没有释放
if(keyLeft)
{
ui->pushButton->move(30,80);
move=true;
}
else
{
ui->pushButton->move(120,80);
}
}
else if(event->key()==Qt::Key_Left)
{
if(event->isAutoRepeat())
{
return ;
}
keyLeft=false;
if(move)
{
//如果完成了移动设为false
move=false;
return;
}
if(keyUp)
{
ui->pushButton->move(30,80);
move=true;
}
else
{
ui->pushButton->move(30,120);
}
}
else if(event->key()==Qt::Key_Down)
{
ui->pushButton->move(120,120);
}
}
Widget::~Widget()
{
delete ui;
}
计时器和随机数
#include "widget.h"
#include "ui_widget.h"
#include<QDebug>
#include<QTimer>
#include<QTime>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
id1=startTimer(1000);
id2=startTimer(1500);
id3=startTimer(2200);
lcd=new QLCDNumber(this);
lcd->resize(200,200);
lcd->show();
QTimer *timer=new QTimer(this);
//关联到定时器的溢出信号到槽上
connect(timer,&QTimer::timeout,this,&Widget::timeUpdate);
timer->start(1000);
qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));
QTimer::singleShot(10000,this,&Widget::close);
}
void Widget::timerEvent(QTimerEvent *event)
{
if(event->timerId()==id1)
{
qDebug()<<"time1";
}
else if(event->timerId()==id2)
{
qDebug()<<"time2";
}
else if(event->timerId()==id3)
{
qDebug()<<"time3";
}
}
void Widget::timeUpdate()
{
QTime time = QTime::currentTime();
QString text =time .toString("hh:mm");
if(time.second()%2==0)
{
text[2]=' ';
}
this->lcd->display(text);
int rand=qrand()%300;
this->lcd->move(rand,rand);
}
Widget::~Widget()
{
delete ui;
}
事件过滤器与事件发送
#include "widget.h"
#include "ui_widget.h"
#include<QKeyEvent>
#include<QWheelEvent>
#include<QKeyEvent>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//在编辑器上安装事件过滤器
ui->textEdit->installEventFilter(this);
ui->spinBox->installEventFilter(this);
//创建键盘事件
QKeyEvent myEvent(QEvent::KeyPress,Qt::Key_Up,Qt::NoModifier);
//发送键盘事件到SpinBox
qApp->sendEvent(ui->spinBox,&myEvent);
}
bool Widget::eventFilter(QObject *obj, QEvent *event)
{
if(obj==ui->textEdit)
{
if(event->type()==QEvent::Wheel)
{
//强制转换事件类型
QWheelEvent *wheelEvent=static_cast <QWheelEvent*>(event);
if(wheelEvent->delta()>0)
{
ui->textEdit->zoomIn();
}
else
{
ui->textEdit->zoomOut();
}
return true;
}
else
{
return false;
}
}
else if(obj==ui->spinBox)
{
if(event->type()==QEvent::KeyPress)
{
QKeyEvent *keyEvent=static_cast<QKeyEvent*>(event);
if(keyEvent->key()==Qt::Key_Space)
{
ui->spinBox->setValue(0);
return true;
}
else
{
return false;
}
}
}
else
{
return eventFilter(obj,event);
}
}
Widget::~Widget()
{
delete ui;
}
信号与槽
信号:
void MyDialog::on_pushButton_clicked()
{
//获取输入的数值
int value=ui->spinBox->value();
//发射信号
emit dlgReturn(value);
//关闭对话框
close();
}
槽:
void Widget::showValue(int value)
{
ui->label->setText(tr("获取的值是:%1").arg(value));
}
关联:
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
MyDialog*dlg=new MyDialog(this);
//将对话框中的信号与主界面中的槽关联
connect(dlg,SIGNAL(dlgReturn(int)),this,SLOT(showValue(int)));
dlg->show();
}
自动关联
#include "widget.h"
#include "ui_widget.h"
#include<QPushButton>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
//创建按钮
QPushButton *button =new QPushButton(this);
//指定按钮对象名
button->setObjectName("myButton");
ui->setupUi(this);
}
void Widget::on_myButton_clicked()
{
close();
}
Widget::~Widget()
{
delete ui;
}
注册属性与输出属性
#ifndef MYCLASS_H
#define MYCLASS_H
#include <QObject>
class MyClass : public QObject
{
Q_OBJECT
//注册属性userName
Q_PROPERTY(QString userName READ getUserName WRITE setUserName NOTIFY userNameChanged)
public:
explicit MyClass(QObject *parent = nullptr);
//实现READ读函数
QString getUserName() const {return m_userName;}
//实现WRITE写函数
void setUserName(QString userName)
{
m_userName =userName;
//属性改变时发射此信号
emit userNameChanged(userName);
}
signals:
//声明NOTIFY通知消息
void userNameChanged(QString);
private:
//存放属性值
QString m_userName;
public slots:
};
#endif // MYCLASS_H
#include "widget.h"
#include "ui_widget.h"
#include"myclass.h"
#include<QDebug>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//创建MyClass类实例
MyClass *my=new MyClass(this);
connect(my,&MyClass::userNameChanged,this,&Widget::userChanged);
//设置属性值
my->setUserName("abc");
qDebug()<<"userName1:"<<my->getUserName();
//使用QOBJECT类设置属性值
my->setProperty("userName","Linux");
//返回值为QVariant
qDebug()<<"userName2:"<<my->property("userName:").toString();
my->setProperty("myValue",10);
qDebug()<<"myValue:"<<my->property("myValue").toInt();
}
void Widget::userChanged(QString userName)
{
qDebug()<<"user changed:"<<userName;
}
Widget::~Widget()
{
delete ui;
}
对象树
#include "widget.h"
#include "ui_widget.h"
#include "mybutton.h"
#include<QPushButton>
#include<QDebug>
#include<QHBoxLayout>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//创建按钮部件 指定widget为父部件
MyButton *button=new MyButton(this);
button->setText(tr("mybutton"));
MyButton *button2=new MyButton;
MyButton *button3=new MyButton;
QHBoxLayout *layout=new QHBoxLayout;
layout->addWidget(button2);
layout->addWidget(button3);
//使用布局管理器后button会调用自己的父物体进行销毁
setLayout(layout);
qDebug()<<children();
}
Widget::~Widget()
{
delete ui;
qDebug()<<"delete widget";
}
Widget对象的建立是在栈上的,关闭程序时会自动销毁。而用new操作符创建的部件是在对上的,指定父物体后无需delete,整个应用关闭时会自动销毁它的所有子部件。
QList
#include <QCoreApplication>
#include<QList>
#include<QDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QList<QString>list;
list<<"aa"<<"bb"<<"cc"; //插入项目
if(list[1]=="bb")
{
list[1]="ab";
}
list.replace(2,"bc");
qDebug()<<"the list is:";
for(int i=0;i<list.size();++i)
{
qDebug()<<list.at(i);
}
//在列表尾部添加
list.append("dd");
list.prepend("mm");
//删除列表第3个项目,并获取它
QString str=list.takeAt(2);
qDebug()<<"at(2) item is:"<<str;
qDebug()<<"the list is: ";
for(int i=0;i<list.size();i++)
{
qDebug()<<list.at(i);
}
list.insert(2,"mm");
list.swap(1,3);
qDebug()<<"the list is:";
for(int i=0;i<list.size();++i)
{
qDebug()<<list.at(i);
}
qDebug()<<"contains 'mm'?"<<list.contains("mm");
//返回mm的个数
qDebug()<<"the 'mm' count"<<list.count("mm");
//默认从位置0开始往前查找
qDebug()<<"the first 'mm' index:"<<list.indexOf("mm");
//从指定位置1开始往前查找
qDebug()<<"the second 'mm' index:"<<list.indexOf("mm",1);
return a.exec();
}
QMap
#include<QCoreApplication>
#include<QMap>
#include<QMultiMap>
#include<QDebug>
int main(int argc,char *argv[])
{
QCoreApplication a(argc,argv);
QMap<QString,int>map;
//向one中插入1
map["one"]=1;
map["two"]=2;
map["three"]=3;
map.insert("seven",7);
//获取键的值,如果使用[],map中没有该键,那么会自动插入
int value1=map["six"];
qDebug()<<"value1:"<<value1;
qDebug()<<"contains 'six'?"<<map.contains("six");
//使用value函数获取键值,键不存在时不会自动插入
int value2=map.value("five");
qDebug()<<"value2:"<<value2;
qDebug()<<"contains 'five'?"<<map.contains("five");
//当键不存在时,value()默认返回0,这里可以设定该值,比如这里设置9
int value3=map.value("nine",9);
qDebug()<<"value3:"<<value3;
//map如果重新给该键设置了值,以前的会被擦除
map.insert("ten",10);
map.insert("ten",100);
qDebug()<<"ten:"<<map.value("ten");
//使用insertMulti()函数来实现一键多值,然后使用values()函数来获取值的列表
map.insertMulti("two",2);
map.insertMulti("two",4);
QList<int> values=map.values("two");
qDebug()<<"two:"<<values;
//用QMultiMap来实现一键多值
QMultiMap<QString,int>map1,map2,map3;
map1.insert("values",1);
map1.insert("values",2);
map2.insert("values",3);
map3=map1+map2;
QList<int>myValues=map3.values("values");
qDebug()<<"the values are:";
for(int i=0;i<myValues.size();i++)
{
qDebug()<<myValues.at(i);
}
return a.exec();
}
QList Java风格迭代器
#include <QCoreApplication>
#include<QList>
#include<QListIterator>
#include<QMutableListIterator>
#include<QDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QList<QString> list;
list<<"A"<<"B"<<"C"<<"D";
//创建列表的只读迭代器,将list作为参数
QListIterator<QString> i(list);
qDebug()<<"the forwardis:";
//正向遍历
while(i.hasNext())
{
qDebug()<<i.next();
}
qDebug()<<"the backwardis:";
//反向遍历
while(i.hasPrevious())
{
qDebug()<<i.previous();
}
QMutableListIterator<QString> j(list);
//返回列表尾部
j.toBack();
while(j.hasPrevious())
{
QString str=j.previous();
//删除项目"B"
if(str=="B")
{
j.remove();
}
}
//在列表最前面项目添加"Q"
j.insert("Q");
j.toBack();
if(j.hasPrevious())
{
j.previous()="N";
}
//取N的前一个,改变成M
j.previous();
j.setValue("M");
j.toFront();
qDebug()<<"the forward is:";
while(j.hasNext())
{
qDebug()<<j.next();
}
return a.exec();
}
QMap java风格迭代器
#include <QCoreApplication>
#include<QMapIterator>
#include<QMutableMapIterator>
#include<QDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QMap<QString,QString> map;
map.insert("Paris","France");
map.insert("Guatemela City","Guatrmala");
map.insert("Mexico City","Mexico");
map.insert("Moscow","Russia");
QMapIterator<QString,QString> i(map);
while(i.hasNext())
{
i.next();
qDebug()<<i.key()<<":"<<i.value();
}
if(i.findPrevious("Mexico"))
{
qDebug()<<"find 'Mexico'";
}
QMutableMapIterator<QString,QString> j(map);
while(j.hasNext())
{
//找到结尾是city的键
if(j.next().key().endsWith("City"))
{
j.remove();
}
}
while(j.hasPrevious())
{
j.previous();
qDebug()<<j.key()<<":"<<j.value();
}
return a.exec();
}
STL风格迭代器
#include<QCoreApplication>
#include<QList>
#include<QDebug>
int main(int argc,char *argv[])
{
QCoreApplication a(argc,argv);
QList<QString> list;
list<<"A"<<"B"<<"C"<<"D";
//使用读写迭代器
QList<QString>::iterator i;
qDebug()<<"the forward is:";
for(i=list.begin();i!=list.end();i++)
{
//转化为小写
*i=(*i).toLower();
qDebug()<<*i;
}
QList<QString>::iterator j;
qDebug()<<"the forward is:";
for(j=list.begin();j<list.end();j++)
{
qDebug()<<*j;
}
QMap<QString,int> map;
map.insert("one",1);
map.insert("two",2);
map.insert("three",3);
QMap<QString,int>::const_iterator p;
qDebug()<<"the forward is:";
for(p=map.constBegin();p!=map.constEnd();++p)
{
qDebug()<<p.key()<<":"<<p.value();
}
return a.exec();
}
foreach
#include<QCoreApplication>
#include<QList>
#include<QMap>
#include<QMultiMap>
#include<QDebug>
int main(int argc,char *argv[])
{
QCoreApplication a(argc,argv);
QList<QString> list;
list.insert(0,"A");
list.insert(1,"B");
list.insert(2,"C");
qDebug()<<"the list is:";
foreach (QString str, list)
{
qDebug()<<str;
}
QMap<QString,int> map;
map.insert("first",1);
map.insert("second",2);
map.insert("third",3);
qDebug()<<endl<<"the map is:";
foreach(QString str,map.keys())
{
qDebug()<<str<<":"<<map.value(str);
}
QMultiMap<QString,int>map2;
map2.insert("first",1);
map2.insert("first",2);
map2.insert("first",3);
map2.insert("second",2);
qDebug()<<endl<<"the map2 is:";
//返回所有键的列表
QList<QString>keys=map2.uniqueKeys();
foreach (QString str, keys)
{
//遍历键中所有值
foreach (int i, map2.values(str))
{
qDebug()<<str<<":"<<i;
}
}
return a.exec();
}
通用STL算法
#include<QCoreApplication>
#include<QVector>
#include<QStringList>
#include<algorithm>
#include<QDebug>
int main(int argc,char *argv[])
{
QCoreApplication a(argc,argv);
QStringList list;
list<<"one"<<"two"<<"three";
qDebug()<<QObject::tr("std::copy算法:");
QVector<QString>vect(3);
//将list中的所有项目copy到vect中
std::copy(list.begin(),list.end(),vect.begin());
qDebug()<<vect;
qDebug()<<endl<<QObject::tr("std::equal算法:");
//从list的开始到结束的所有项目与vect的开始及后面的等数量的项目进行比较
bool ret1=std::equal(list.begin(),list.end(),vect.begin());
qDebug()<<"equal:"<<ret1;
qDebug()<<endl<<QObject::tr("std::find算法:");
//从list中查找two,返回第一个对应的值的迭代器,如果没有找到就返回end()
QList<QString>::iterator i=std::find(list.begin(),list.end(),"two");
qDebug()<<*i;
qDebug()<<endl<<QObject::tr("std::fill算法:");
//将所有项目填充为eleven
std::fill(list.begin(),list.end(),"eleven");
qDebug()<<list;
QList<int> list1;
list1<<3<<3<<6<<6<<6<<8;
qDebug()<<endl<<QObject::tr("std::count算法:");
int countOf6=std::count(list1.begin(),list1.end(),6);
qDebug()<<"countOf6:"<<countOf6;
qDebug()<<endl<<QObject::tr("std::lower_bound算法:");
//返回第一个5出现的位置,如果没有5,返回5应该在的位置
//list1被查找的范围中的项目必须是升序
QList<int>::iterator j=std::lower_bound(list1.begin(),list1.end(),5);
list1.insert(j,5);
qDebug()<<list1;
QList<int> list2;
list2<<33<<12<<68<<6<<12;
qDebug()<<endl<<QObject::tr("std::sort算法:");
//使用快速排序算法对list2进行升序排序
std::sort(list2.begin(),list2.end());
qDebug()<<list2;
qDebug()<<endl<<QObject::tr("std::stable_sort算法:");
std::stable_sort(list2.begin(),list2.end());
qDebug()<<list2;
qDebug()<<endl<<QObject::tr("std::greater算法:");
//反向排序
qSort(list2.begin(),list2.end(),std::greater<int>());
qDebug()<<list2;
qDebug()<<endl<<QObject::tr("std::swap算法");
double pi=3.14;
double e=2.71;
std::swap(pi,e);
qDebug()<<"pi:"<<pi<<"e:"<<e;
return a.exec();
}
QString
#include <QCoreApplication>
#include<QDebug>
#include<QStringList>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
qDebug()<<QObject::tr("以下是编辑字符串操作:")<<endl;
QString str="hello";
qDebug()<<QObject::tr("字符串大小:")<<str.size();
str[0]=QChar('H');
qDebug()<<QObject::tr("第一个字符:")<<str[0];
str.append("Qt");
//将第1个字符开始的后面4个字符替换成字符串"i"
str.replace(1,4,"i");
//在第二个字符串后插入"my"
str.insert(2,"my");
qDebug()<<QObject::tr("str为:")<<str;
//两个字符串组合
str=str+"!!!";
qDebug()<<QObject::tr("str为:")<<str;
str="hi\r\nQt!\n";
qDebug()<<QObject::tr("str为:")<<str;
//除去字符串两端的空白字符
QString str1=str.trimmed();
qDebug()<<QObject::tr("str1为:")<<str1;
//除去字符串两端和中间多余的空白字符
QString str2=str.simplified();
qDebug()<<QObject::tr("str2为:")<<str2;
str="hi,my,,Qt";
//从字符串"."的地方将其分为多个字符串
//QString::SkipEmptyParts表示跳过空的条目
QStringList list=str.split(",",QString::SkipEmptyParts);
qDebug()<<QObject::tr("list为:")<<list;
//将各个字符串组合为一个字符串,中间用" "隔开
str=list.join(" ");
qDebug()<<QObject::tr("list组合后为:")<<str;
qDebug()<<QString().isNull();
qDebug()<<QString().isEmpty();
//用isEmpty()判断是否为空
qDebug()<<QString(" ").isNull();
qDebug()<<QString(" ").isEmpty();
qDebug()<<QObject::tr("以下是在字符串中进行查询的操作:")<<endl;
str="yafeilinux";
qDebug()<<QObject::tr("字符串为:")<<str;
qDebug()<<QObject::tr("包含右侧后5个字符的子字符串:")<<str.right(5);
qDebug()<<QObject::tr("包含左侧前5个字符的子字符串:")<<str.left(5);
qDebug()<<QObject::tr("包含第2个字符以后3个字符的子字符串:")<<str.mid(2,3);
qDebug()<<QObject::tr("fei的位置:")<<str.indexOf("fei");
qDebug()<<QObject::tr("str中第0个字符:")<<str.at(0);
qDebug()<<QObject::tr("str中i的个数:")<<str.count('i');
qDebug()<<QObject::tr("str是否从ya开始:")<<str.startsWith("ya");
qDebug()<<QObject::tr("str是否以linux结尾")<<str.endsWith("linux");
qDebug()<<QObject::tr("str是否包含lin字符串")<<str.contains("lin");
QString temp="hello";
if(temp>str)
{
qDebug()<<temp;
}
else
{
qDebug()<<str;
}
qDebug()<<endl<<QObject::tr("以下是字符串的转换操作:")<<endl;
str="100";
qDebug()<<QObject::tr("字符串转换为整数:")<<str.toInt();
int num=45;
qDebug()<<QObject::tr("整数转换为字符串:")<<QString::number(num);
str="FF";
bool ok;
int hex=str.toInt(&ok,16);
qDebug()<<"ok:"<<ok<<QObject::tr("转换为十六进制:")<<hex;
num=26;
qDebug()<<QObject::tr("使用十六进制将整数转化为字符串:")<<QString::number(num,16);
str="123,456";
qDebug()<<QObject::tr("字符串转换为浮点型:")<<str.toUpper();
str="ABC";
qDebug()<<QObject::tr("转换为大写:")<<str.toUpper();
str="abc";
qDebug()<<QObject::tr("转换为小写:")<<str.toLower();
int age=25;
QString name="yafei";
str=QString("name is %1,age is %2").arg(name).arg(age);
qDebug()<<QObject::tr("更改后的str为:")<<str;
str="%1%2";
qDebug()<<str.arg("%1f","hello");
qDebug()<<str.arg("%1f").arg("hello");
str=QString("ni%1").arg("hi",5,'*');
qDebug()<<QObject::tr("设置字段宽度为5,使用'*'填充:")<<str;
qreal value=123.456;
str=QString("number:%1").arg(value,0,'f',2);
qDebug()<<QObject::tr("设置小数点后两位:")<<str;
qDebug()<<QObject::tr("将str转换为const char* :")<<qPrintable(str);
return a.exec();
}
QVariant
#include "widget.h"
#include "ui_widget.h"
#include<QDebug>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
QVariant v1(15);
qDebug()<<v1.toInt();
QColor color=QColor(Qt::red);
QVariant v4=color;
qDebug()<<v4.type();
qDebug()<<v4.value<QColor>();
QString str="hello";
QVariant v5=str;
qDebug()<<v5.canConvert(QVariant::Int);
qDebug()<<v5.toString();
qDebug()<<v5.convert(QVariant::Int);
//转换失败,被清空
qDebug()<<v5.toString();
}
正则表达式
#include "widget.h"
#include "ui_widget.h"
#include<QDebug>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//两个字符都必须为数字,第二个字符可以没有
//0~99
QRegExp rx("^\\d\\d? $");
qDebug()<<rx.indexIn("a1");
qDebug()<<rx.indexIn("5");
qDebug()<<rx.indexIn("5x");
qDebug()<<rx.indexIn("12");
qDebug()<<rx.indexIn("123");
qDebug()<<"******************";
//匹配mail或者letter单词
rx.setPattern("\\b(mail|letter)\\b");
qDebug()<<rx.indexIn("emailletter");
qDebug()<<rx.indexIn("my mail");
qDebug()<<rx.indexIn("my mail letter");
qDebug()<<"*******************";
//匹配字符M,其后面不能跟有ail字符
rx.setPattern("M(?!ail)");
QString str1="this is M";
str1.replace(rx,"Mail");
qDebug()<<"str1:"<<str1;
QString str2="my M,Your Ms,his Mail";
str2.replace(rx,"Mail");
qDebug()<<"str2:"<<str2;
qDebug()<<"********************";
QString str3="One Eric another Eirik."
"and an Ericsson How many Ericks, Eric?";
//E开头i可有可无,后接ri或rick,匹配数量
QRegExp rx2("\\bEi?ri[ck]\\b");
int pos=0;
int count=0;
while(pos>=0)
{
pos=rx2.indexIn(str3,pos);
if(pos>=0)
{
++pos;
++count;
}
}
qDebug()<<"count:"<<count;
QRegExp rx3("*.txt");
rx3.setPatternSyntax(QRegExp::Wildcard);
qDebug()<<rx3.exactMatch("README.txt");
qDebug()<<rx3.exactMatch("Welcome.txt.bak");
QRegExp rx4("(\\d+)");
QString str4="Offsets:12 14 99 231 7";
QStringList list;
int pos2=0;
while(pos2=rx4.indexIn(str4,pos2)!=-1)
{
//第一个捕获到的文本
list<<rx4.cap(1);
//上一个匹配的字符串的长度
pos2+=rx4.matchedLength();
}
qDebug()<<list;
QRegExp rxlen("(\\d+)(?:\\s*)(cm|inch)");
int pos3=rxlen.indexIn("Length:189cm");
if(po3>-1)
{
QString value=rxlen.cap(1);
QString unit=rxlen.cap(2);
QString string=rxlen.cap(3);
qDebug()<<value<<unit<<string;
}
QRegExp rx5("\\b(\\w+)\\W+\\1\\b");
//设置不区分大小写
rx5.setCaseSensitivity(Qt::CaseInsensitive);
qDebug()<<rx5.indexIn("Hello--hello");
qDebug()<<rx5.cap(1);
//匹配中文
QRegExp rx6("\\你好\\");
qDebug()<<rx6.indexIn("你好");
//完全匹配使用0捕获
qDebug()<<rx6.cap(0);
}
Widget::~Widget()
{
delete ui;
}
Qt5 QRegularExpression类
#include "widget.h"
#include "ui_widget.h"
#include<QDebug>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//Qt5模式字符串
QRegularExpression re("a pattern");
//Qt5用setPattern()
QRegularExpression re2;
re2.setPattern("Another Pattern");
//不区分大小写
QRegularExpression re3("Qt rocks",QRegularExpression::CaseInsensitiveOption);
//通过patternOption()
QRegularExpression re4("^\\d+$");
re4.setPatternOptions(QRegularExpression::MultilineOption);
//设置^匹配开头,$匹配结尾
QRegularExpression::PatternOptions option =re.patternOptions();
QRegularExpression re5("^(\\d\\d)/(\\d\\d)/(\\d\\d\\d\\d)$");
QRegularExpressionMatch match=re5.match("08/12/1985");
if(match.hasMatch())
{
QString matched=match.captured(0);
QString day=match.captured(1);
QString month=match.captured(2);
QString year=match.captured(3);
qDebug()<<"match:"<<match
<<"day:"<<day
<<"month:"<<month
<<"year:"<<year;
}
QString pattern("^(Jan|Feb|Mar|Apr|May) \\d\\d?,\\d\\d\\d$");
QRegularExpression re6(pattern);
QString input("Jan 21,");
QRegularExpressionMatch match1=re6.match(input,0,QRegularExpression::PartialPreferCompleteMatch);
//判断完全匹配
bool hasMatch=match1.hasMatch();
//判断部分匹配
bool hasParticalMatch=match1.hasPartialMatch();
qDebug()<<"match:"<<hasMatch<<"ParticalMatch:"<<hasParticalMatch;
QRegularExpression re7("\\d\\d\\w+");
//跳过第一个匹配到的12 abc 偏移量为1
QRegularExpressionMatch match2=re.match("12 abc 45 def",1);
}
Widget::~Widget()
{
delete ui;
}
自定义样式表
QMainWindow{
background-image:url(:/image/图片2.jpg)
}
QPushButton{
background-color:rgba(100,225,100,30);
//边框样式
border-style:outset;
//边框宽度为4像素
border-width:4px;
//边框圆角半径
border-radius:10px;
//边框颜色
border-color:rgba(255,255,255,30);
//字体
font:bold 14px;
color:rgba(0,0,0,100);
//填衬
padding:6px;
}
QPushButton:hover{
background-color:rgba(100,255,100,100);
border-color:rgba(255,255,255,200);
color:rgba(0,0,0,100);
}
QPushButton:Pressed{
background-color:rgba(100,255,100,200);
border-color:rgba(255,255,255,30);
border-style:inset;
color:rgba(0,0,0,100);
}
QSlider::handle:horizontal{
image:url(:/image/图片4.jpg);
}
QSlider::sub-page:horizontal{
image:url(:/image/图片8.jpg);
}
实现换肤功能
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QFile>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
// ui->pushButton->setStyleSheet("background:yellow");
// ui->horizontalSlider->setStyleSheet("background:blue");
setStyleSheet("QPushButton{background:yellow}QSlider{background:blue}");
qssFile=new QFile(":/qss/my.qss",this);
//只读的方式打开该文件
qssFile->open(QFile::ReadOnly);
//读取全部的内容
QString stylesheet=QString(qssFile->readAll());
qApp->setStyleSheet(stylesheet);
qssFile->close();
}
MainWindow::~MainWindow()
{
delete ui;
}
不规则窗体
#include "widget.h"
#include "ui_widget.h"
#include<QPixmap>
#include<QBitmap>
#include<QPainter>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
// QPixmap pixmap(":/image/image1.jpg");
// ui->label->setPixmap(pixmap);
// ui->label->setMask(pixmap.mask());
QPixmap pix;
//加载图片
pix.load(":/image/image1.jpg");
//设置窗口大小为图片大小
resize(pix.size());
setMask(pix.mask());
}
void Widget::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.drawPixmap(0,0,QPixmap(":/image/image1.jpg"));
}
void Widget::mousePressEvent(QMouseEvent *)
{
close();
}
Widget::~Widget()
{
delete ui;
}
透明窗体
第二种需要设置标题栏
#include "widget.h"
#include "ui_widget.h"
#include<QPainter>
#include<QGraphicsDropShadowEffect>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//设置窗口不透明度为0.5
// setWindowOpacity(0.5);
// setWindowFlags(Qt::FramelessWindowHint);
// setAttribute(Qt::WA_TranslucentBackground);
//创建阴影效果
QGraphicsDropShadowEffect *effect =new QGraphicsDropShadowEffect;
//设置阴影颜色
effect->setColor(QColor(100,100,100,100));
//设置阴影模糊半径
effect->setBlurRadius(2);
//设置阴影偏移值
effect->setOffset(10);
//标签部件使用阴影效果
ui->label->setGraphicsEffect(effect);
}
void Widget::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.fillRect(rect(),QColor(255,255,255,100));
}
Widget::~Widget()
{
delete ui;
}
毛玻璃效果
win10貌似不可用
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QtWinExtras>
#include<QDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
if(QtWin::isCompositionEnabled())
{
qDebug()<<"true";
QtWin::extendFrameIntoClientArea(this,-1,-1,-1,-1);
setAttribute(Qt::WA_TranslucentBackground,true);
setAttribute(Qt::WA_NoSystemBackground,false);
setStyleSheet("MainWindow{background:transparent;}");
}
else
{
qDebug()<<"false";
QtWin::resetExtendedFrame(this);
setAttribute(Qt::WA_TranslucentBackground,false);
setStyleSheet(QString("MainWindow{background:%1;}").arg(QtWin::realColorizationColor().name()));
}
}
MainWindow::~MainWindow()
{
delete ui;
}
图形的绘制与填充
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
}
void Widget::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.drawLine(QPoint(0,0),QPoint(100,100));
//创建画笔
QPen pen(Qt::green,5,Qt::DashLine,Qt::RoundCap,Qt::RoundJoin);
//使用画笔
painter.setPen(pen);
QRectF rectangle(70.0,40.0,80.0,60.0);
int startAngle=30*16;
int spanAngle=120*16;
//绘制圆弧
painter.drawArc(rectangle,startAngle,spanAngle);
//重新设置画笔
pen.setWidth(1);
pen.setStyle(Qt::SolidLine);
painter.setPen(pen);
//绘制一个矩形
painter.drawRect(160,20,50,40);
//创建画刷
QBrush brush(QColor(0,0,255),Qt::Dense4Pattern);
//使用画刷
painter.setBrush(brush);
//绘制椭圆
painter.drawEllipse(200,20,50,50);
//设置纹理
//brush.setTexture();
//重新使用画刷
painter.setBrush(brush);
//定义4个点
static const QPointF points[4]={
QPointF(270.0,80.0),
QPointF(290.0,10.0),
QPointF(350.0,30.0),
QPointF(390.0,70.0)
};
//使用4个点绘制多边形
painter.drawPolygon(points,4);
//使用画刷填充一个矩形区域
painter.fillRect(QRect(10,100,150,20),QBrush(Qt::darkYellow));
//擦除一个矩形区域的内容
painter.eraseRect(QRect(50,0,50,120));
}
Widget::~Widget()
{
delete ui;
}
渐变效果
//线性渐变
QLinearGradient linearGradient(QPointF(40,190),QPointF(70,190));
//插入颜色
linearGradient.setColorAt(0,Qt::yellow);
linearGradient.setColorAt(0.5,Qt::red);
linearGradient.setColorAt(1,Qt::green);
//指定渐变区域以外的区域的扩散方式
linearGradient.setSpread(QGradient::RepeatSpread);
//使用渐变作为画刷
painter.setBrush(linearGradient);
painter.drawRect(10,170,90,40);
//辐射渐变
QRadialGradient radialGradient(QPointF(200,190),50,QPointF(275,200));
radialGradient.setColorAt(0,QColor(255,255,100,150));
radialGradient.setColorAt(1,QColor(0,0,0,50));
painter.setBrush(radialGradient);
painter.drawEllipse(QPointF(200,190),50,50);
//锥形渐变
QConicalGradient conicalGradient(QPointF(350,190),60);
conicalGradient.setColorAt(0.2,Qt::cyan);
conicalGradient.setColorAt(0.9,Qt::black);
painter.setBrush(conicalGradient);
painter.drawEllipse(QPoint(350,190),50,50);
//画笔使用线性渐变来绘制直线和文字
painter.setPen(QPen(linearGradient,2));
painter.drawLine(0,280,100,280);
painter.drawText(150,280,tr("helloQt!"));
文件QFile
#include <QCoreApplication>
#include<QFileInfo>
#include<QStringList>
#include<QDateTime>
#include<QDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
//以只写的方式打开,如果文件不存在,那么创建该文件
QFile file("myfile.txt");
if(!file.open(QIODevice::WriteOnly|QIODevice::Text)){
qDebug()<<file.errorString();
}
file.write("helloQt!\nlinux");
file.close();
//获取文件信息
QFileInfo info(file);
qDebug()<<QObject::tr("绝对路径:")<<info.absoluteFilePath()<<endl
<<QObject::tr("文件名:")<<info.fileName()<<endl
<<QObject::tr("基本名称:")<<info.baseName()<<endl
<<QObject::tr("后缀:")<<info.suffix()<<endl
<<QObject::tr("创建时间:")<<info.created()<<endl
<<QObject::tr("大小:")<<info.size();
//以只读方式打开
if(!file.open(QIODevice::ReadOnly|QIODevice::Text))
{
qDebug()<<file.errorString();
}
qDebug()<<QObject::tr("文件内容:")<<endl<<file.readAll();
qDebug()<<QObject::tr("当前位置:")<<file.pos();
file.seek(0);
QByteArray array;
array=file.read(5);
qDebug()<<QObject::tr("前5个字符:")<<array
<<QObject::tr("当前位置:")<<file.pos();
file.seek(15);
array=file.read(5);
qDebug()<<QObject::tr("第16-20个字符:")<<array;
file.close();
return a.exec();
}
文件系统监视器QFileSystemWatcher
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QDir>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
//将监视器信号与自定义槽相关联
connect(&myWatcher,&QFileSystemWatcher::directoryChanged,
this,&MainWindow::showMessage);
connect(&myWatcher,&QFileSystemWatcher::fileChanged,
this,&MainWindow::showMessage);
//显示当前目录下的所有.h文件
QDir myDir(QDir::currentPath());
myDir.setNameFilters(QStringList("*.h"));
ui->listWidget->addItem(myDir.absolutePath()+tr("目录下的.h文件有:"));
ui->listWidget->addItems((myDir.entryList()));
//创建目录,并将其加入到监视器中
QFile file(myDir.absolutePath()+"myfile.txt");
if(file.open(QIODevice::WriteOnly))
{
QFileInfo info(file);
ui->listWidget->addItem(tr("监视的文件:")+info.absoluteFilePath());
myWatcher.addPath(info.absoluteFilePath());
file.close();
}
}
//显示文件或目录改变信息
void MainWindow::showMessage(const QString &path)
{
QDir dir(QDir::currentPath()+"/mydir");
//如果是目录发生了改变
if(path==dir.absolutePath())
{
ui->listWidget->addItem(dir.dirName()+tr("目录发生改变:"));
ui->listWidget->addItems(dir.entryList());
}
else
{
//如果文件发生了改变
ui->listWidget->addItem(path+tr("文件发生改变!"));
}
}
MainWindow::~MainWindow()
{
delete ui;
}