《Qt Creater》学习笔记

窗口部件

#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;
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt Creator是一个跨平台的C++集成开发环境(IDE),专门用于开发Qt应用程序。它提供了一整套工具,包括代码编辑器、可视化GUI设计工具、调试器、静态代码分析器和自动构建工具等,可以帮助开发者更加高效地开发Qt程序。以下是Qt Creator的一些特点和使用方法: 1.特点: - 支持多种编译器和调试器,包括GCC、Clang、MSVC和MinGW等。 - 提供了丰富的代码编辑功能,包括语法高亮、自动补全、代码折叠、代码重构等。 - 集成了可视化GUI设计器,可以通过拖拽和放置的方式快速创建用户界面。 - 支持多种版本控制系统,包括Git、Subversion和Perforce等。 - 提供了强大的调试功能,包括断点调试、变量监视、堆栈跟踪等。 - 支持自动化构建和部署,可以快速生成可执行文件和安装包。 2.使用方法: - 安装Qt Creator:可以从Qt官网下载Qt Creator的安装包,也可以通过包管理器安装。 - 创建项目:在Qt Creator中,可以通过“File”->“New File or Project”来创建新项目。选择“Qt Widgets Application”或“Qt Quick Application”模板,然后按照向导进行设置即可。 - 编写代码:在Qt Creator中,可以通过“Projects”视图来管理项目文件和设置构建选项。在“Edit”视图中,可以编辑代码并使用各种代码编辑功能。 - 设计用户界面:在Qt Creator中,可以通过“Design”视图来设计用户界面。可以使用拖拽和放置的方式添加控件,并设置其属性和布局。 - 调试程序:在Qt Creator中,可以通过“Debug”视图来调试程序。可以设置断点、监视变量、查看堆栈等。 - 构建和部署:在Qt Creator中,可以通过“Build”视图来构建程序。可以选择不同的构建配置和目标平台,并生成可执行文件和安装包。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值