Qt练习

测试按钮

mywidget.cpp

#include "mywidget.h"
#include 
#include 
#include 

MyWidget::MyWidget(QWidget *parent)
    : QWidget(parent)
{
    setMinimumSize(200,120);
    setMaximumSize(200,120);//最小和最大一样说明这个窗口不能改变大小
    QPushButton *quit = new QPushButton("Quit",this);
    quit->setGeometry(40,40,75,30);
    quit->setFont(QFont("Times",18,QFont::Bold));//字体使用times,18号字体,加粗
    connect(quit,SIGNAL(clicked()),qApp,SLOT(quit()));//点击这个按钮,这个窗口消失
}

MyWidget::~MyWidget()
{

}

具有复选框的树形控件

widget.h

#ifndef WIDGET_H
#define WIDGET_H
#include 
#include 

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();
    void init();
    void updateParentItem(QTreeWidgetItem *item);

private:
    Ui::Widget *ui;
public slots:
    void treeItemChanged(QTreeWidgetItem *item,int column);
};

#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    init();
    connect(ui->treeWidget,SIGNAL(itemChanged(QTreeWidgetItem*,int)),this,SLOT(treeItemChanged(QTreeWidgetItem*,int)));
}

Widget::~Widget()
{
    delete ui;
}
void Widget::init()
{
    ui->treeWidget->clear();
    QTreeWidgetItem *group1 = new QTreeWidgetItem(ui->treeWidget);
    group1->setText(0,"group1");
    group1->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
    group1->setCheckState(0,Qt::Unchecked);
    QTreeWidgetItem *subItem1 = new QTreeWidgetItem(group1);
    subItem1->setText(0,"subItem1");
    subItem1->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
    subItem1->setCheckState(0,Qt::Unchecked);
    QTreeWidgetItem *subItem2 = new QTreeWidgetItem(group1);
    subItem2->setText(0,"subItem2");
    subItem2->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
    subItem2->setCheckState(0,Qt::Unchecked);
    QTreeWidgetItem *subItem3 = new QTreeWidgetItem(group1);
    subItem3->setText(0,"subItem3");
    subItem3->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
    subItem3->setCheckState(0,Qt::Unchecked);
}
void Widget::treeItemChanged(QTreeWidgetItem *item,int column)
{
    QString itemText=item->text(0);
    if(Qt::Checked == item->checkState(0))
    {
        QTreeWidgetItem *parent = item->parent();
        int count = item->childCount();
        if(count > 0)
        {
            for(int i=0; ichild(i)->setCheckState(0,Qt::Checked);
            }
        }
        else
        {
            updateParentItem(item);
        }
    }
    else if(Qt::Unchecked == item->checkState(0))
    {
        int count = item->childCount();
        if(count > 0)
        {
            for(int i=0; ichild(i)->setCheckState(0,Qt::Unchecked);
            }
        }
        else
        {
            updateParentItem(item);
        }
    }
}
void Widget::updateParentItem(QTreeWidgetItem *item)
{
    QTreeWidgetItem *parent = item->parent();
    if(parent == NULL)
        return;
    int selectedCount = 0;
    int childcount = parent->childCount();
    for(int i=0; iQTreeWidgetItem *childItem = parent->child(i);
        if(childItem->checkState(0) == Qt::Checked)
            selectedCount++;
    }
    if(selectedCount <= 0)//子列表每一个选中
    {
        parent->setCheckState(0,Qt::Unchecked);
    }
    else if(selectedCount > 0 && selectedCount < childcount)//子列表部分选中
    {
        parent->setCheckState(0,Qt::PartiallyChecked);
    }
    else//子列表都选中
    {
        parent->setCheckState(0,Qt::Checked);
    }
}

设置一个特定输入的文本框

dialog.h

#ifndef DIALOG_H
#define DIALOG_H

#include 

namespace Ui {
class Dialog;
}

class Dialog : public QDialog
{
    Q_OBJECT

public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();

private:
    Ui::Dialog *ui;
private slots:
    void on_lineEdit_textChanged();
};

#endif // DIALOG_H

dialog.cpp

#include "dialog.h"
#include "ui_dialog.h"

Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
    QRegExp regExp("[A-Za-z][1-9][0-9]{0,2}");
    //这是一个正则表达式,输入的第一个为字母,接着为1-9的一个数字,再接着是0-2个0-9的数字
    ui->lineEdit->setValidator(new QRegExpValidator(regExp,this));
    //为输入框设置正则表达式
    connect(ui->okButton,SIGNAL(clicked()),this,SLOT(accept()));
    connect(ui->cancelButton,SIGNAL(clicked()),this,SLOT(reject()));
}

Dialog::~Dialog()
{
    delete ui;
}
void Dialog::on_lineEdit_textChanged()
{
    ui->okButton->setEnabled(ui->lineEdit->hasAcceptableInput());
    //输入匹配时OK按钮才能用
}

这里写图片描述

分隔窗口(各个窗口的大小可以随意拖拽)

main.cpp

#include "mainwindow.h"
#include 
#include 
#include 

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QFont font("ZYSong18030",12);
    a.setFont(font);
    QSplitter *splitterMain = new QSplitter(Qt::Horizontal,0);
    QTextEdit *textleft = new QTextEdit(QObject::tr("Left Widget"),splitterMain);
    textleft->setAlignment(Qt::AlignCenter);
    QSplitter *splitterRight = new QSplitter(Qt::Vertical,splitterMain);
    splitterMain->setOpaqueResize(false);
    QTextEdit *textUp = new QTextEdit(QObject::tr("Top Widget"),splitterRight);
    textUp->setAlignment(Qt::AlignCenter);
    QTextEdit *textBottom = new QTextEdit(QObject::tr("Bottom Widget"),splitterRight);
    textBottom->setAlignment(Qt::AlignCenter);
    splitterMain->setStretchFactor(1,1);
    splitterMain->setWindowTitle(QObject::tr("splitter"));
    splitterMain->show();
    return a.exec();
}

Qt练习_第1张图片

进度条和进度条对话框

progressdlg.h

#ifndef PROGRESSDLG_H
#define PROGRESSDLG_H

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

class ProgressDlg : public QDialog
{
    Q_OBJECT

public:
    ProgressDlg(QWidget *parent = 0);
    ~ProgressDlg();
private slots:
    void startProgress();
private:
    QLabel *fileNum;
    QLineEdit *fileNumLineEdit;
    QLabel *progressType;
    QComboBox *comboBox;
    QProgressBar *progressBar;
    QPushButton *startBtn;
    QGridLayout *mainLayout;
};

#endif // PROGRESSDLG_H

progressdlg.cpp




#include "progressdlg.h"
#include 
#include 
#include 

ProgressDlg::ProgressDlg(QWidget *parent)
    : QDialog(parent)
{
    QFont font("ZYSong18030",12);
    setFont(font);
    setWindowTitle(tr("Progress"));
    fileNum = new QLabel;
    fileNum->setText(tr("文件数目"));
    fileNumLineEdit = new QLineEdit;
    fileNumLineEdit->setText(tr("10000"));

    progressType = new QLabel;
    progressType->setText(tr("显示类型"));
    comboBox = new QComboBox;
    comboBox->addItem(tr("ProgressBar"));
    comboBox->addItem(tr("ProgressDialog"));
    progressBar = new QProgressBar;
    startBtn = new QPushButton;
    startBtn->setText(tr("开始"));
    mainLayout = new QGridLayout(this);
    mainLayout->addWidget(fileNum,0,0);
    mainLayout->addWidget(fileNumLineEdit,0,1);
    mainLayout->addWidget(progressType,1,0);
    mainLayout->addWidget(comboBox,1,1);
    mainLayout->addWidget(progressBar,2,0,1,2);
    mainLayout->addWidget(startBtn,3,1);
    mainLayout->setMargin(15);//设置布局管理器的外边距
    mainLayout->setSpacing(10);//各个控件之间的距离
    connect(startBtn,SIGNAL(clicked()),this,SLOT(startProgress()));
}

ProgressDlg::~ProgressDlg()
{

}
void ProgressDlg::startProgress()
{
    bool ok;
    int num = fileNumLineEdit->text().toInt(&ok);
    if(comboBox->currentIndex() == 0)
    {
        progressBar->setRange(0,num);
        for(int i=1; i<=num; i++)
        {
            progressBar->setValue(i);
        }
    }
    else if(comboBox->currentIndex() == 1)
    {
        QProgressDialog *progress = new QProgressDialog(this);
        QFont font("ZYSong18030",12);
        progress->setFont(font);
        progress->setWindowModality(Qt::WindowModal);
        //时间至少为多少才出现对话框,没起作用啊
        progress->setMinimumDuration(10000);
        progress->setWindowTitle(tr("Please Wait"));
        progress->setLabelText(tr("copying...."));
        progress->setCancelButtonText(tr("取消"));
        progress->setRange(0,num);
        for(int i=1; i<=num; i++)
        {
            progress->setValue(i);
            if(progress->wasCanceled())
                return;
        }
    }
}

Qt练习_第2张图片Qt练习_第3张图片

电子时钟

digiclock.h

#ifndef DIGICLOCK_H
#define DIGICLOCK_H
#include 

class DigiClock : public QLCDNumber
{
    Q_OBJECT

public:
    DigiClock(QWidget *parent = 0);
    void mousePressEvent(QMouseEvent *);
    void mouseMoveEvent(QMouseEvent *);
    ~DigiClock();
public slots:
    void showTime();
private:
    QPoint dragPosition;//保存鼠标点相对于电子时钟窗体左上角的偏移值
    bool showColon;//用于显示时间是否显示“:”
};

#endif // DIGICLOCK_H

digiclock.cpp

#include "digiclock.h"
#include 
#include 
#include 

DigiClock::DigiClock(QWidget *parent)
    : QLCDNumber(parent)
{
    QPalette p = palette();
    p.setColor(QPalette::Window,Qt::blue);//给角色指定颜色
    setPalette(p);//设置调色板
    setWindowFlags(Qt::FramelessWindowHint);
    setWindowOpacity(0.5);
    QTimer *timer = new QTimer(this);
    connect(timer,SIGNAL(timeout()),this,SLOT(showTime()));
    timer->start(1000);
    showTime();
    resize(150,60);//改变小部件的大小
    showColon = true;//控制电子时钟“时”与“分”之间的表示秒钟的两个点的闪显功能
}

DigiClock::~DigiClock()
{

}
void DigiClock::showTime()
{
    QTime time = QTime::currentTime();
    QString text = time.toString("hh:mm");
    if(showColon)
    {
        text[2]= ':';
        showColon = false;
    }
    else
    {
        text[2] = ' ';
        showColon = true;
    }
    display(text);
}
void DigiClock::mousePressEvent(QMouseEvent *event)//左键的作用没太理解
{
    if(event->button() == Qt::LeftButton)
    {
        dragPosition = event->globalPos() - frameGeometry().topLeft();
        event->accept();//时间接收器接收这个事件
    }
    if(event->button() == Qt::RightButton)
    {
        close();//点击右键会关闭
    }
}
void DigiClock::mouseMoveEvent(QMouseEvent *event)//左键的作用没太理解
{
    if(event->button() && Qt::LeftButton)
    {
        move(event->globalPos()-dragPosition);
        event->accept();
    }
}

main.cpp

#include "clock.h"
#include 
#include 

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    DigiClock clock;
    clock.show();
    return a.exec();
}

这里写图片描述

QStackedLayout

可以用QComBox或者存有页面名字的QListWidget来让用户选择页面
mainwindow.cpp

#include "mainwindow.h"
#include 
#include 
#include 

MainWindow::MainWindow(QWidget *parent)
    : QWidget(parent)
{


   QWidget *firstPageWidget = new QWidget;
   QWidget *secondPageWidget = new QWidget;
   QWidget *thirdPageWidget = new QWidget;
   QLabel *label1 = new QLabel(tr("one"),firstPageWidget);
   QLabel *label2 = new QLabel(tr("two"),secondPageWidget);
   QLabel *label3 = new QLabel(tr("three"),thirdPageWidget);

   QStackedLayout *stackedLayout = new QStackedLayout;
   stackedLayout->addWidget(firstPageWidget);
   stackedLayout->addWidget(secondPageWidget);
   stackedLayout->addWidget(thirdPageWidget);
   QComboBox *pageComboBox = new QComboBox;
   pageComboBox->addItem(tr("Page 1"));
   pageComboBox->addItem(tr("Page 2"));
   pageComboBox->addItem(tr("Page 3"));
   connect(pageComboBox, SIGNAL(activated(int)),
         stackedLayout, SLOT(setCurrentIndex(int)));

   QVBoxLayout *mainLayout = new QVBoxLayout;
   mainLayout->addLayout(stackedLayout);
   mainLayout->addWidget(pageComboBox);
   setLayout(mainLayout);
}

MainWindow::~MainWindow()
{

}

QDockWidget使用

dockwindows.cpp

#include "dockwindows.h"
#include 
#include 

DockWindows::DockWindows(QWidget *parent)
    : QMainWindow(parent)
{

    setWindowTitle(tr("DockWindows"));
    QTextEdit *te = new QTextEdit(this);
    te->setText(tr("Main Window"));
    te->setAlignment(Qt::AlignCenter);
    setCentralWidget(te);//设置主窗口的中心控件

    QDockWidget *dock = new QDockWidget(tr("DockWindow1"),this);
    dock->setFeatures(QDockWidget::DockWidgetMovable);//可移动
    dock->setAllowedAreas(Qt::LeftDockWidgetArea|Qt::RightDockWidgetArea);//设置可以停靠的位
    QTextEdit *tel = new QTextEdit();
    tel->setText(tr("can be moved between docks by the users"));
    dock->setWidget(tel);
    addDockWidget(Qt::RightDockWidgetArea,dock);//要放的位置,被放的控件

    dock = new QDockWidget(tr("DockWindows2"),this);
    dock->setFeatures(QDockWidget::DockWidgetClosable|QDockWidget::DockWidgetFloatable);//可关闭,可浮动
    QTextEdit *te2 = new QTextEdit();
    te2->setText(tr("可关闭,可浮动"));
    dock->setWidget(te2);
    addDockWidget(Qt::RightDockWidgetArea,dock);//要放的位置,被放的控件

    dock = new QDockWidget(tr("DockWindows3"),this);
    dock->setFeatures(QDockWidget::AllDockWidgetFeatures);
    QTextEdit *te3 = new QTextEdit();
    te3->setText(tr("所有特性"));
    dock->setWidget(te3);//注意名字别设置错误,要是里面写成te,会把te当成窗口3的内容,而不是中心内容了
    addDockWidget(Qt::RightDockWidgetArea,dock);
}

DockWindows::~DockWindows()
{

}

Qt练习_第4张图片

带标签的QDockWidget

qdockwidget3.cpp

#include "qdockwidget3.h"
#include 

QDockWidget3::QDockWidget3(QWidget *parent)
    : QMainWindow(parent)
{
    QDockWidget *s1 = new QDockWidget(tr("页面1"),this);
    s1->setFeatures(QDockWidget::AllDockWidgetFeatures);
    s1->setAllowedAreas(Qt::LeftDockWidgetArea);
    addDockWidget(Qt::LeftDockWidgetArea,s1);
    QDockWidget *s2 = new QDockWidget(tr("页面2"),this);
    s2->setFeatures(QDockWidget::AllDockWidgetFeatures);
    s2->setAllowedAreas(Qt::LeftDockWidgetArea);
    addDockWidget(Qt::LeftDockWidgetArea,s2);
    this->tabifyDockWidget(s1,s2);//s1加到s2后面形成标签
    QDockWidget *s3 = new QDockWidget(tr("页面3"),this);
    s3->setFeatures(QDockWidget::AllDockWidgetFeatures);
    s3->setAllowedAreas(Qt::LeftDockWidgetArea);
    addDockWidget(Qt::LeftDockWidgetArea,s3);
    this->tabifyDockWidget(s1,s3);//s1加到s3后面形成标签
}

QDockWidget3::~QDockWidget3()
{

}

Qt练习_第5张图片
参考资料:http://www.cnblogs.com/sfy5848/p/4835458.html

可扩展对话框练习

extensiondlg.h

#ifndef EXTENSIONDLG_H
#define EXTENSIONDLG_H

#include 
#include 

class ExtensionDlg : public QDialog
{
    Q_OBJECT

public:
    ExtensionDlg(QWidget *parent = 0);
    ~ExtensionDlg();
private slots:
    void showDetailInfo();
private:
    void createBaseInfo();
    void createDetailInfo();
    QWidget *baseWidget;
    QWidget *detailWidget;
};

#endif // EXTENSIONDLG_H

extensiondlg.cpp

#include "extensiondlg.h"
#include 
#include 
#include 
#include 
#include 
#include 
#include 

ExtensionDlg::ExtensionDlg(QWidget *parent)
    : QDialog(parent)
{
    setWindowTitle(tr("Extension Dialog"));
    createBaseInfo();
    createDetailInfo();
    QVBoxLayout *layout = new QVBoxLayout(this);
    layout->addWidget(baseWidget);
    layout->addWidget(detailWidget);
    layout->setSizeConstraint(QLayout::SetFixedSize);//设置窗体大小固定,否则再次点击“详细”按钮时,对话框不能恢复到初始状态
    layout->setSpacing(10);//设置布局内的间距
}

ExtensionDlg::~ExtensionDlg()
{

}
void ExtensionDlg::createBaseInfo()
{
    baseWidget = new QWidget;
    QLabel *nameLabel = new QLabel(tr("姓名"));
    QLineEdit *nameLineEdit = new QLineEdit;

    QLabel *sexLabel = new QLabel(tr("性别"));
    QComboBox *sexComboBox = new QComboBox;
    sexComboBox->insertItem(0,tr("女"));
    sexComboBox->insertItem(1,tr("男"));

    QGridLayout *leftLayout = new QGridLayout;
    leftLayout->addWidget(nameLabel,0,0);
    leftLayout->addWidget(nameLineEdit,0,1);
    leftLayout->addWidget(sexLabel,1,0);
    leftLayout->addWidget(sexComboBox,1,1);

    QPushButton *OKBtn = new QPushButton(tr("确定"));
    QPushButton *DetailBtn = new QPushButton(tr("详细"));
    QDialogButtonBox *btnBox = new QDialogButtonBox(Qt::Vertical);
    btnBox->addButton(OKBtn,QDialogButtonBox::ActionRole);
    btnBox->addButton(DetailBtn,QDialogButtonBox::ActionRole);

    QHBoxLayout *mainLayout = new QHBoxLayout(baseWidget);
    mainLayout->addLayout(leftLayout);
    mainLayout->addWidget(btnBox);
    connect(DetailBtn,SIGNAL(clicked()),this,SLOT(showDetailInfo()));
}
void ExtensionDlg::createDetailInfo()
{
    detailWidget = new QWidget;
    QLabel *ageLabel = new QLabel(tr("年龄"));
    QLineEdit *ageLineEdit = new QLineEdit;
    ageLineEdit->setText(tr("30"));

    QLabel *depLabel = new QLabel;
    depLabel->setText(tr("部门"));
    QComboBox *depCom = new QComboBox;
    depCom->addItem(tr("部门1"));
    depCom->addItem(tr("部门2"));
    depCom->addItem(tr("部门3"));
    depCom->addItem(tr("部门4"));

    QLabel *emailLabel = new QLabel(tr("email"));
    QLineEdit *emailLineEdit = new QLineEdit;

    QGridLayout *mainLayout = new QGridLayout(detailWidget);
    mainLayout->addWidget(ageLabel,0,0);
    mainLayout->addWidget(ageLineEdit,0,1);
    mainLayout->addWidget(depLabel,1,0);
    mainLayout->addWidget(depCom,1,1);
    mainLayout->addWidget(emailLabel,2,0);
    mainLayout->addWidget(emailLineEdit,2,1);

    detailWidget->hide();
}
void ExtensionDlg::showDetailInfo()
{
    if(detailWidget->isHidden())
        detailWidget->show();
    else
        detailWidget->hide();
}

Qt练习_第6张图片Qt练习_第7张图片

读取文件

qt控制台应用
main.cpp

#include 
#include 
#include 

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QFile file("textFile1.txt");//将文件放到编译产生的目录下,也可以指定路径
    if(file.open(QIODevice::ReadOnly))
    {
        char buffer[2048];
        qint64 lineLen = file.readLine(buffer,sizeof(buffer));//返回读到的字节数
        if(lineLen != -1)//如果东西没有读到,则返回-1
        {
            qDebug()<return a.exec();
}

QTextStream类读写文件

#include 
#include 
#include 

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QFile data("123.txt");
    if(data.open(QFile::WriteOnly|QFile::Truncate))
    {
        QTextStream ff(&data);//将数据写入data指向的文件中,参数为文件指针
        ff<"score:")<10)<90<//设置字段宽度为10
    }
    return a.exec();
}

Qt练习_第8张图片

读写二进制文件

mainwindow.cpp

#include "mainwindow.h"
#include 
#include 
#include 
#include 

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    fileFun();
}

MainWindow::~MainWindow()
{

}
void MainWindow::fileFun()
{
    QFile file("binary.dat");
    file.open(QIODevice::WriteOnly|QIODevice::Truncate);
    QDataStream out(&file);
    out<"我擦"));//将字符串序列化
    out<"1994/09/25","yyyy/MM/dd");
    out<<(qint32)19;
    file.close();

    file.setFileName("binary.dat");
    if(!file.open(QIODevice::ReadOnly))
    {
        qDebug()<<"error";
        return;
    }
    QDataStream in(&file);
    QString name;
    QDate birthday;
    qint32 age;
    in>>name>>birthday>>age;
    qDebug()<;
    file.close();
}

递归读取分目录和总目录的大小

main.cpp

#include 
#include 
#include 
#include 
#include 

//递归读取分目录的大小
qint64 du(const QString &path)
{
    QDir dir(path);
    qint64 size = 0;
    //QDir::Files,List files.
    foreach (QFileInfo fileinfo, dir.entryInfoList(QDir::Files)) {
        size += fileinfo.size();
    }
    //QDir::Dirs,List directories that match the filters.
    //QDir::NoDotAndDotDot,Do not list the special entries "." and "..".
    foreach (QString subDir, dir.entryList(QDir::Dirs|QDir::NoDotAndDotDot)) {
        size += du(path + QDir::separator() + subDir);
    }
    char unit = 'B';
    qint64 curSize = size;
    if(curSize > 1024)
    {
        curSize /= 1024;
        unit = 'K';
        if(curSize > 1024)
        {
            curSize /= 1024;
            unit = 'M';
            if(curSize > 1024)
            {
                curSize /= 1024;
                unit = 'G';
            }
        }
    }
    //返回目录的名字及大小
    qDebug()<unit<<"\t"<return size;
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QStringList args = a.arguments();
    QString path;
    if(args.count() > 1)
    {
        path  = args[1];
    }
    else
    {
        path = QDir::currentPath();
    }
    qDebug()<return a.exec();
}

Qt练习_第9张图片

文件显示器

fileview.h

#ifndef FILEVIEW_H
#define FILEVIEW_H

#include 
#include 
#include 
#include 
#include 
#include 
#include 

class FileView : public QDialog
{
    Q_OBJECT

public:
    FileView(QWidget *parent = 0);
    ~FileView();
    void showFileInfoList(QFileInfoList list);
public slots:
    void slotShow(QDir dir);
    void slotDirshow(QListWidgetItem *item);
private:
    QLineEdit *fileLineEdit;
    QListWidget *fileListWidget;
    QVBoxLayout *mainLayout;
};

#endif // FILEVIEW_H

fileview.cpp

#include "fileview.h"
#include 
#include 
#include 
#include 
#include 
#include 

FileView::FileView(QWidget *parent)
    : QDialog(parent)
{
    setWindowTitle(tr("File View"));
    fileLineEdit = new QLineEdit(tr("/"));
    fileListWidget = new QListWidget;
    mainLayout = new QVBoxLayout(this);
    mainLayout->addWidget(fileLineEdit);
    mainLayout->addWidget(fileListWidget);
    //returnPressed,信号返回或者回车键被按下时触发
    connect(fileLineEdit,SIGNAL(returnPressed()),this,SLOT(slotShow(QDir)));
    //这一个槽函数没有连接上,有时间改不会了
    connect(fileListWidget,SIGNAL(itemDoubleClicked(QListWidgetItem*)),this,SLOT(slotDirshow(QListWidgetItem*)));
    QString root = "/";
    QDir rootDir(root);
    QStringList string;
    string << "*";
    QFileInfoList list = rootDir.entryInfoList(string);
    showFileInfoList(list);
}

FileView::~FileView()
{

}
//显示文本款指定的目录下的文件
void FileView::slotShow(QDir dir)
{
    QStringList string;
    string << "*";
    QFileInfoList list = dir.entryInfoList(string,QDir::AllEntries,QDir::DirsFirst);
    //列出所有目录和文件,目录放前面,文件放后面
    showFileInfoList(list);
}
//双击浏览器中显示的目录进入下一级目录,单击".."返回上一级目录,编辑框显示当前所在目录
void FileView::showFileInfoList(QFileInfoList list)
{
    fileListWidget->clear();//清空列表控件
    for(unsigned int i=0; i<list.count(); i++)
    {
        QFileInfo temp = list.at(i);
        if(temp.isDir())
        {
            QIcon icon("dir.png");//没有素材就不添加了
            QString filename = temp.fileName();
            QListWidgetItem *tmp = new QListWidgetItem(icon,filename);
            fileListWidget->addItem(tmp);
        }
        else
        {
            QIcon icon("file.png");
            QString filename = temp.fileName();
            QListWidgetItem *tmp = new QListWidgetItem(icon,filename);
            fileListWidget->addItem(tmp);
        }
    }
}
void FileView::slotDirshow(QListWidgetItem *item)
{
    QString str = item->text();
    QDir dir;
    dir.setPath(fileLineEdit->text());
    dir.cd(str);
    fileLineEdit->setText(dir.absolutePath());
    slotShow(dir);
}

Qt练习_第10张图片

获取文件信息

fileinfo.h

#ifndef FILEINFO_H
#define FILEINFO_H

#include 
#include 
#include 
#include 
#include 

class FileInfo : public QDialog
{
    Q_OBJECT

public:
    FileInfo(QWidget *parent = 0);
    ~FileInfo();

private slots:
    void slotFile();
    void slotGet();
private:
    QLabel *fileNameLabel;
    QLineEdit *fileNameLineEdit;
    QPushButton *fileNameBtn;

    QLabel *sizeLabel;
    QLineEdit *sizeLineEdit;

    QLabel *createTimeLabel;
    QLineEdit *createTimeLineEdit;

    QLabel *lastModifyLabel;
    QLineEdit *lastModifyEdit;

    QLabel *lastReadLabel;
    QLineEdit *lastReadLineEdit;

    QLabel *propertyLabel;

    QCheckBox *isDir;
    QCheckBox *isFile;
    QCheckBox *link;
    QCheckBox *isHidden;
    QCheckBox *isReadable;
    QCheckBox *isWritable;
    QCheckBox *isExecutable;

    QPushButton *getBtn;
};

#endif // FILEINFO_H

fileinfo.cpp

#include "fileinfo.h"
#include 
#include 
#include 
#include 
#include 

FileInfo::FileInfo(QWidget *parent)
    : QDialog(parent)
{
    fileNameLabel = new QLabel(tr("文件名"));
    fileNameLineEdit = new QLineEdit;
    fileNameBtn = new QPushButton(tr("文件"));

    sizeLabel = new QLabel(tr("大小"));
    sizeLineEdit = new QLineEdit;

    createTimeLabel = new QLabel(tr("创建时间"));
    createTimeLineEdit = new QLineEdit;

    lastModifyLabel = new QLabel(tr("最后修改时间"));
    lastModifyEdit = new QLineEdit;

    lastReadLabel = new QLabel(tr("最后访问时间"));
    lastReadLineEdit = new QLineEdit;

    propertyLabel = new QLabel(tr("属性"));

    isDir = new QCheckBox(tr("目录"));
    isFile = new QCheckBox(tr("文件"));
    link = new QCheckBox(tr("符号连接"));
    isHidden = new QCheckBox(tr("隐藏"));
    isReadable = new QCheckBox(tr("读"));
    isWritable = new QCheckBox(tr("写"));
    isExecutable = new QCheckBox(tr("执行"));

    getBtn = new QPushButton(tr("获得文件信息"));
    QGridLayout *gridLayout = new QGridLayout;

    gridLayout->addWidget(fileNameLabel,0,0);
    gridLayout->addWidget(fileNameLineEdit,0,1);
    gridLayout->addWidget(fileNameBtn,0,2);

    gridLayout->addWidget(sizeLabel,1,0);
    gridLayout->addWidget(sizeLineEdit,1,1,1,2);

    gridLayout->addWidget(createTimeLabel,2,0);
    gridLayout->addWidget(createTimeLineEdit,2,1,1,2);

    gridLayout->addWidget(lastModifyLabel,3,0);
    gridLayout->addWidget(lastModifyEdit,3,1,1,2);

    gridLayout->addWidget(lastReadLabel,4,0);
    gridLayout->addWidget(lastReadLineEdit,4,1,1,2);

    QHBoxLayout *layout2 = new QHBoxLayout;
    layout2->addWidget(propertyLabel);
    layout2->addStretch();
    QHBoxLayout *layout3 = new QHBoxLayout;
    layout3->addWidget(isDir);
    layout3->addWidget(isFile);
    layout3->addWidget(link);
    layout3->addWidget(isHidden);
    layout3->addWidget(isReadable);
    layout3->addWidget(isWritable);
    layout3->addWidget(isExecutable);

    QHBoxLayout *layout4 = new QHBoxLayout;
    layout4->addWidget(getBtn);

    QVBoxLayout *mainLayout = new QVBoxLayout(this);
    mainLayout->addLayout(gridLayout);
    mainLayout->addLayout(layout2);
    mainLayout->addLayout(layout3);
    mainLayout->addLayout(layout4);

    connect(fileNameBtn,SIGNAL(clicked()),this,SLOT(slotFile()));
    connect(getBtn,SIGNAL(clicked()),this,SLOT(slotGet()));

}

FileInfo::~FileInfo()
{

}

void FileInfo::slotFile()
{
    QString fileName = QFileDialog::getOpenFileName(this,"打开","/","files(*)");
    fileNameLineEdit->setText(fileName);
}
void FileInfo::slotGet()
{
    QString file = fileNameLineEdit->text();
    QFileInfo info(file);
    qint64 size = info.size();
    QDateTime created = info.created();
    QDateTime lastModify = info.lastModified();
    QDateTime lastRead = info.lastRead();

    bool isDir1 = info.isDir();
    bool isFile1 = info.isFile();
    bool isSymLink1 = info.isSymLink();
    bool isHidden1 = info.isHidden();
    bool isReadable1 = info.isReadable();
    bool isWritable1 = info.isWritable();
    bool isExecutable1 = info.isExecutable();

    sizeLineEdit->setText(QString::number(size));
    createTimeLineEdit->setText(created.toString());
    lastModifyEdit->setText(lastModify.toString());
    lastReadLineEdit->setText(lastRead.toString());

    //剩下的选中状态不写了,太麻烦
    isDir->setCheckState(isDir ? Qt::Checked : Qt::Unchecked);
}

主窗体练习

ShowWidget是中心部件
showwidge.h

#ifndef SHOWWIDGET_H
#define SHOWWIDGET_H

#include 
#include 
#include 
#include 
#include 

class ShowWidget : public QWidget
{
    Q_OBJECT
public:
    explicit ShowWidget(QWidget *parent = 0);
    QImage img;
    QLabel *imageLabel;//用来显示图形的标签
    QTextEdit *text;
    ~ShowWidget();

signals:

public slots:
};

#endif // SHOWWIDGET_H

showwidget.cpp

#include "showwidget.h"
#include 

ShowWidget::ShowWidget(QWidget *parent) : QWidget(parent)
{
    imageLabel = new QLabel;
    imageLabel->setScaledContents(true);

    text = new QTextEdit;
    QHBoxLayout *mainLayout = new QHBoxLayout(this);
    mainLayout->addWidget(imageLabel);
    mainLayout->addWidget(text);
}

ShowWidget::~ShowWidget()
{

}

ImgProcessor是主窗口
imgprocessor.h

#ifndef IMGPROCESSOR_H
#define IMGPROCESSOR_H

#include 
#include 
#include 
#include 
#include 
#include 

class ImgProcessor : public QMainWindow
{
    Q_OBJECT

public:
    ImgProcessor(QWidget *parent = 0);
    ~ImgProcessor();

    void createActions();
    void createMenus();
    void createToolBars();

    void loadFile(QString filename);
    void mergeFormat(QTextCharFormat);

private:
    QMenu *fileMenu;
    QMenu *zoomMenu;//变焦

    QImage img;
    QString fileName;
    ShowWidget *showWidget;

    QAction *openFileAction;
    QAction *newFileAction;
    QAction *printTextAction;
    QAction *printImageAction;
    QAction *exitAction;
    QAction *aboutAction;

    QAction *copyAction;
    QAction *cutAction;
    QAction *pasteAction;

    QAction *undoAction;
    QAction *redoAction;

    QToolBar *fileTool;

    QToolBar *doToolBar;

protected slots:
    void showNewFile();

    void showOpenFile();

    void showAbout();
};

#endif // IMGPROCESSOR_H

imgprocessor.cpp

#include "imgprocessor.h"
#include 
#include 
#include 
#include 

ImgProcessor::ImgProcessor(QWidget *parent)
    : QMainWindow(parent)
{
    setWindowTitle(tr("Easy Word"));
    showWidget = new ShowWidget(this);
    setCentralWidget(showWidget);//设定中心部件
    createActions();
    createMenus();
    createToolBars();
    if(img.load("E:\\QTworkspace\\ImgProcessor\\image.png"))//如果图片加载成功
    {
        showWidget->imageLabel->setPixmap(QPixmap::fromImage(img));
    }
}

ImgProcessor::~ImgProcessor()
{

}
void ImgProcessor::createActions()
{
    openFileAction = new QAction(tr("打开"),this);
    openFileAction->setShortcut(tr("Ctrl+O"));
    openFileAction->setStatusTip(tr("打开一个文件"));//悬浮在上面的时候的指示
    connect(openFileAction,SIGNAL(triggered()),this,SLOT(showOpenFile()));
    newFileAction = new QAction(tr("新建"),this);
    newFileAction->setStatusTip(tr("新建一个文件"));
    connect(newFileAction,SIGNAL(triggered()),this,SLOT(showNewFile()));
    aboutAction = new QAction(tr("关于"),this);
    connect(aboutAction,SIGNAL(triggered()),this,SLOT(showAbout()));
    exitAction = new QAction(tr("退出"),this);
    exitAction->setStatusTip(tr("退出程序"));
    connect(exitAction,SIGNAL(triggered()),this,SLOT(close()));
    copyAction =new QAction(tr("复制"),this);
    connect(copyAction,SIGNAL(triggered()),showWidget->text,SLOT(copy()));
    cutAction = new QAction(tr("剪切"),this);
    connect(cutAction,SIGNAL(triggered()),showWidget->text,SLOT(cut()));
    pasteAction = new QAction(tr("粘贴"),this);
    connect(pasteAction,SIGNAL(triggered()),showWidget->text,SLOT(paste()));
    undoAction = new QAction("撤销",this);
    connect(undoAction,SIGNAL(triggered()),showWidget->text,SLOT(undo()));
    redoAction = new QAction("恢复",this);
    connect(redoAction,SIGNAL(triggered()),showWidget->text,SLOT(redo()));

}
void ImgProcessor::createMenus()
{
    fileMenu = menuBar()->addMenu(tr("文件"));//返回QMainWindow的QMenuBar,并用QMenuBar的函数添加菜单
    fileMenu->addAction(openFileAction);
    fileMenu->addAction(newFileAction);
    fileMenu->addSeparator();//在下拉的条中加入一个分隔符
    fileMenu->addAction(aboutAction);
    fileMenu->addAction(exitAction);

    zoomMenu = menuBar()->addMenu(tr("编辑"));
    zoomMenu->addAction(copyAction);
    zoomMenu->addAction(cutAction);
    zoomMenu->addAction(pasteAction);
}
void ImgProcessor::createToolBars()
{
    fileTool = addToolBar("File");//添加到QMainWindow中的ToolBar
    fileTool->addAction(openFileAction);
    fileTool->addAction(newFileAction);

    doToolBar = addToolBar("doEdit");
    doToolBar->addAction(undoAction);
    doToolBar->addAction(redoAction);
}
void ImgProcessor::showNewFile()
{
    ImgProcessor *newImgProcessor = new ImgProcessor;
    newImgProcessor->show();
}
void ImgProcessor::showOpenFile()
{
    fileName = QFileDialog::getOpenFileName(this);
    if(!fileName.isEmpty())
    {
        if(showWidget->text->document()->isEmpty())//文本内容为空就重新兴建一个
        {
            loadFile(fileName);
        }
        else
        {
            ImgProcessor *newImgProcessor = new ImgProcessor;
            newImgProcessor->show();
            newImgProcessor->loadFile(fileName);
        }
    }
}

void ImgProcessor::loadFile(QString filename)
{
    QFile file(filename);
    if(file.open(QIODevice::ReadOnly|QIODevice::Text))
    {
        QTextStream textStream(&file);
        while(!textStream.atEnd())
        {
            showWidget->text->append(textStream.readLine());
            //读取一行文本,里面的参数是每次读取的最大长度
        }
    }
}
void ImgProcessor::showAbout()
{
    QMessageBox::about(this,tr("关于产品"),tr("create by zzti_erlie"));
}

Qt练习_第11张图片

QTableWidget

表格类一般用到3个类,一个是QTableView可以定义的部分很多,一个是QTableWidget,一个是QTableWidgetItem(表格里面插入的内容),注意:要设置QTableWidget的行数和列数添加的Item才会显示出来
参考博客1:http://blog.csdn.net/xgbing/article/details/7774737
参考博客2:http://www.cnblogs.com/li-peng/p/3654634.html
参考博客3:http://www.cnblogs.com/findumars/p/5553367.html

mainwindow.cpp

#include "mainwindow.h"
#include <QTableWidget>
#include <QTableWidgetItem>
#include <QStringList>
#include <QHeaderView>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    //指定行和列
    QTableWidget *table = new QTableWidget(5,3,this);
    //table->resize(600,600);
    QStringList header;
    header << "书名" << "出版社" << "作者";
    //设置列标题
    table->setHorizontalHeaderLabels(header);
    //从QTableView上继承下来的方法,返回的是QHeaderView,并且设置最后一列自动填充剩余空间
    table->horizontalHeader()->setStretchLastSection(true);
    //table如何你设置了5列,它会自动加上一列,显示行号,这个就是设置不要系统自动加的那一列
    table->verticalHeader()->setVisible(false);
    //从QAbstractItemView继承下来的方法,项目的修改方式
    table->setEditTriggers(QAbstractItemView::DoubleClicked);
    //从QAbstractItemView继承下来的方法,选中的方式
    table->setSelectionBehavior(QAbstractItemView::SelectRows);
    QTableWidgetItem *item[10];
    QString bookName[5] = {"书名1","书名2","书名3","书名4","书名5"};
    for(int i=0; i<5; i++)
    {
        item[i] = new QTableWidgetItem;
        item[i]->setText(bookName[i]);
        //3个参数分别是行号,列号,和要放的元素
        table->setItem(i,0,item[i]);
    }
    setCentralWidget(table);
}

Qt练习_第12张图片

QTabWidget

mainwindow.cpp

#include "mainwindow.h"
#include <QTabWidget>
#include <QWidget>
#include <QHBoxLayout>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    QTabWidget *tabWidget = new QTabWidget;
    QWidget *mainWidget = new QWidget;
    QWidget *firstWidget = new QWidget;
    QWidget *secondWidget = new QWidget;
    QWidget *thirdWidget = new QWidget;
    tabWidget->addTab(firstWidget,tr("第一页"));
    tabWidget->addTab(secondWidget,tr("第二页"));
    tabWidget->addTab(thirdWidget,tr("第三页"));
    QHBoxLayout *mainLayout = new QHBoxLayout;
    mainLayout->addWidget(tabWidget);
    mainWidget->setLayout(mainLayout);
    setCentralWidget(mainWidget);
}

Qt练习_第13张图片

QTreeWidget

mainwindow.cpp

#include "mainwindow.h"
#include <QTreeWidget>
#include <QTreeWidgetItem>
#include <QList>
#include <QStringList>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    QTreeWidget *treeWidget = new QTreeWidget();
    QStringList headers;
    headers << "Name"
            << "Numbers";
    treeWidget->setHeaderLabels(headers);
    QTreeWidgetItem *root = new QTreeWidgetItem(treeWidget);
    root->setText(0,"root");
    root->setText(1,"0");
    //直接指定父对象
    QTreeWidgetItem *leaf1 = new QTreeWidgetItem(root);
    leaf1->setText(0,"leaf1");
    leaf1->setText(1,"1");
    //先不指定父对象,以后被添加
    QTreeWidgetItem *leaf2 = new QTreeWidgetItem();
    leaf2->setText(0,"leaf2");
    leaf2->setText(1,"2");
    root->addChild(leaf2);
    QList<QTreeWidgetItem*> items;
    for(int i=0; i<10; i++)
        items.append(new QTreeWidgetItem((QTreeWidget*)0,QStringList(QString("ListItem%1").arg(i))));
    treeWidget->insertTopLevelItems(1,items);
    setCentralWidget(treeWidget);
}

Qt练习_第14张图片

QListWidget

#include "mainwindow.h"
#include 
#include 
#include 
#include 

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    QListWidget *listWidget = new QListWidget(this);
    //直接指定父对象
    new QListWidgetItem(tr("item1"),listWidget);
    new QListWidgetItem(tr("item2"),listWidget);
    //直接添加,不用指定父对象
    listWidget->addItem(new QListWidgetItem(tr("item4")));
    //在指定行插入
    listWidget->insertItem(2,new QListWidgetItem(tr("item3")));
    setCentralWidget(listWidget);
}

Qt练习_第15张图片

QListWidget实现文件组的选择

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include 
#include 

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}
//打开文件按钮
void MainWindow::on_openFileBtn_clicked()
{
    QStringList files = QFileDialog::getOpenFileNames(
                            this,
                            "Select one or more files to open",
                            "",
                            "Xml File (*.xml)");
    foreach (QString fileUrl, files) {
        int index = fileUrl.lastIndexOf("/");
        //从url中截取文件名字
        QString fileName = fileUrl.mid(index+1);
        ui->listWidget->addItem(fileName);
        //存储文件名字和文件url的map,方面以后操作,例子懒的写了
        map.insert(fileName,fileUrl);
    }
}
//确定按钮
void MainWindow::on_okBtn_clicked()
{

}
//把选中的条目移动到右边
void MainWindow::on_addBtn_clicked()
{
    QListWidgetItem *listWidgetItem = ui->listWidget->currentItem();
    //没有选中按钮就点击会发生错误
    if (listWidgetItem != NULL) {
        qDebug() << listWidgetItem->text();
        QListWidgetItem *listWidgetItem1 = new QListWidgetItem(listWidgetItem->text());
        ui->listWidget_2->addItem(listWidgetItem1);
        ui->listWidget->removeItemWidget(listWidgetItem);
        delete listWidgetItem;
    }
}
//把选中的条目移动到左边
void MainWindow::on_removeBtn_clicked()
{
    QList<QListWidgetItem*> list = ui->listWidget_2->selectedItems();
    foreach (QListWidgetItem* listWidgetItem, list) {
        QListWidgetItem *listWidget1 = new QListWidgetItem(listWidgetItem->text());
        ui->listWidget->addItem(listWidget1);
        ui->listWidget_2->removeItemWidget(listWidgetItem);
        delete listWidgetItem;
    }
}
//把选中的条目向上移动
void MainWindow::on_moveUpBtn_clicked()
{
    qDebug() << "moveup";
    QListWidgetItem *item = ui->listWidget_2->currentItem();
    if (item != NULL) {
        QListWidgetItem *item1 = new QListWidgetItem(item->text());
        int index = ui->listWidget_2->currentRow();
        if (index >= 1) {
            ui->listWidget_2->insertItem(index-1,item1);
            ui->listWidget_2->removeItemWidget(item);
            delete item;
        }
    }
}
//把选中的条目向下移动
void MainWindow::on_moveDownBtn_clicked()
{
    qDebug() << "movedown";
    QListWidgetItem *item = ui->listWidget_2->currentItem();
    if (item != NULL) {
        QListWidgetItem *item1 = new QListWidgetItem(item->text());
        int index = ui->listWidget_2->currentRow();
        qDebug() << ui->listWidget_2->count();
        qDebug() << index;
        if (index < ui->listWidget_2->count()-1) {
            ui->listWidget_2->insertItem(index+2,item1);
            ui->listWidget_2->removeItemWidget(item);
            delete item;
        }
    }
}

Qt练习_第16张图片

从XML中解析出来的数据显示在QTableWidget中

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include 

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    void doXML(const QString operate);

private slots:
    void on_queryBtn_clicked();
    void on_deleteBtn_clicked();
    void on_updateBtn_clicked();
    void on_insertBtn_clicked();
    void on_loadBtn_clicked();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    setWindowTitle(tr("小型图书管理系统"));
    ui->tableWidget->setColumnCount(3);
    QStringList header;
    header << "编号" << "书名" << "作者";
    ui->tableWidget->setHorizontalHeaderLabels(header);
    //添加XML说明
    QDomDocument doc;
    QDomProcessingInstruction instruction = doc.createProcessingInstruction("xml","version=\"1.0\" encoding=\"UTF-8\"");
    doc.appendChild(instruction);
    //添加根元素
    QDomElement root = doc.createElement("书库");
    doc.appendChild(root);
    //添加第一个图书元素
    QDomElement book = doc.createElement("图书");
    QDomAttr id = doc.createAttribute("编号");
    id.setValue("1");
    book.setAttributeNode(id);
    QDomElement title = doc.createElement("书名");
    QDomText text;
    text = doc.createTextNode("Qt");
    title.appendChild(text);
    QDomElement author = doc.createElement("作者");
    text = doc.createTextNode("li");
    author.appendChild(text);
    book.appendChild(title);
    book.appendChild(author);
    root.appendChild(book);
    QFile file("my.xml");
    //以只读和重写方式打开
    if(!file.open(QIODevice::WriteOnly | QIODevice::Truncate))
        return;
    QTextStream out(&file);
    doc.save(out,4);
    file.close();
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::doXML(const QString operate)
{
    //如果操作中途有失败,则这个会显示出来,如果操作都成功则这个显示会被覆盖
    statusBar()->showMessage("操作失败",2000);
    QFile file("my.xml");
    if(!file.open(QIODevice::ReadOnly))
        return;
    QDomDocument doc;
    if(!doc.setContent(&file))
    {
        file.close();
        return;
    }
    file.close();
    QDomNodeList list = doc.elementsByTagName("图书");
    for(int i=0; i
    {
        QDomElement e = list.at(i).toElement();
        if(e.attribute("编号") == ui->lineEdit->text())
        {
            if(operate == "delete")
            {
                QDomElement root = doc.documentElement();
                root.removeChild(list.at(i));
                file.setFileName("my.xml");
                if(!file.open(QIODevice::WriteOnly | QIODevice::Truncate))
                    return;
                QTextStream out(&file);
                doc.save(out,4);
                file.close();
                statusBar()->showMessage("删除成功",2000);
            }
            else if(operate == "update")
            {
                QDomNodeList child = list.at(i).childNodes();
                //将子节点的第一个节点即文本节点的内容改变
                child.at(0).toElement().firstChild().setNodeValue(ui->lineEdit_2->text());
                child.at(1).toElement().firstChild().setNodeValue(ui->lineEdit_3->text());
                file.setFileName("my.xml");
                if(!file.open(QIODevice::WriteOnly | QIODevice::Truncate))
                    return;
                QTextStream out(&file);
                doc.save(out,4);
                file.close();
                statusBar()->showMessage("更改成功",2000);
            }
            else if(operate == "query")
            {
                ui->tableWidget->clear();
                //清除的时候会把标题也清除,所以重新写一下标题
                QStringList header;
                header << "编号" << "书名" << "作者";
                ui->tableWidget->setHorizontalHeaderLabels(header);
                ui->tableWidget->setRowCount(1);
                QTableWidgetItem *item = new QTableWidgetItem;
                item->setText(e.attribute("编号"));
                ui->tableWidget->setItem(0,0,item);
                QDomNodeList list = e.childNodes();
                for(int i=0; i
                {
                    QDomNode node = list.at(i);
                    if(node.isElement())
                    {
                        QTableWidgetItem *item = new QTableWidgetItem;
                        if(node.toElement().tagName() == "书名")
                        {
                            item->setText(node.toElement().text());
                            ui->tableWidget->setItem(0,1,item);
                        }
                        else if(node.toElement().tagName() == "作者")
                        {
                            item->setText(node.toElement().text());
                            ui->tableWidget->setItem(0,2,item);
                        }
                    }
                }
                statusBar()->showMessage("查询成功",2000);
            }
        }
    }
}

void MainWindow::on_queryBtn_clicked()
{
    doXML("query");
}

void MainWindow::on_deleteBtn_clicked()
{
    doXML("delete");
}

void MainWindow::on_updateBtn_clicked()
{
    doXML("update");
}

void MainWindow::on_insertBtn_clicked()
{
    QFile file("my.xml");
    if(!file.open(QIODevice::ReadOnly))
        return;
    QDomDocument doc;
    if(!doc.setContent(&file))
    {
        file.close();
        return;
    }
    file.close();
    QDomElement root = doc.documentElement();
    QDomElement book = doc.createElement("图书");
    QDomAttr id = doc.createAttribute("编号");
    QDomElement title = doc.createElement("书名");
    QDomElement author = doc.createElement("作者");
    QDomText text;
    QString lastNum = root.lastChild().toElement().attribute("编号");
    int count = lastNum.toInt() + 1;
    id.setValue(QString::number(count));
    book.setAttributeNode(id);
    text = doc.createTextNode(ui->lineEdit_2->text());
    title.appendChild(text);
    text = doc.createTextNode(ui->lineEdit_3->text());
    author.appendChild(text);
    book.appendChild(title);
    book.appendChild(author);
    root.appendChild(book);
    if(!file.open(QIODevice::WriteOnly | QIODevice::Truncate))
        return;
    QTextStream out(&file);
    doc.save(out,4);
    file.close();
}

void MainWindow::on_loadBtn_clicked()
{
    QFile file("my.xml");
    if(!file.open(QIODevice::ReadOnly))
        return;
    QDomDocument doc;
    if(!doc.setContent(&file))
    {
        file.close();
        return;
    }
    file.close();
    //返回根元素
    QDomElement root = doc.documentElement();
    //返回第一个节点
    QDomNode n = root.firstChild();
    //记录是表格的第几行
    int row = -1;
    //table如何你设置了5列,它会自动加上一列,显示行号,这个就是设置不要系统自动加的那一列
    ui->tableWidget->verticalHeader()->setVisible(false);
    while(!n.isNull())
    {
        if(n.isElement())
        {
            row++;
            //设置表格的行数不然不会显示
            ui->tableWidget->setRowCount(row+1);
            QDomElement e = n.toElement();
            QTableWidgetItem *item = new QTableWidgetItem;
            item->setText(e.attribute("编号"));
            ui->tableWidget->setItem(row,0,item);
            QDomNodeList list = e.childNodes();
            for(int i=0; i
            {
                QDomNode node = list.at(i);
                if(node.isElement())
                {
                    QTableWidgetItem *item = new QTableWidgetItem;
                    if(node.toElement().tagName() == "书名")
                    {
                        item->setText(node.toElement().text());
                        ui->tableWidget->setItem(row,1,item);
                    }
                    else if(node.toElement().tagName() == "作者")
                    {
                        item->setText(node.toElement().text());
                        ui->tableWidget->setItem(row,2,item);
                    }
                }
            }
        }
        n = n.nextSibling();
    }
    //显示加载完毕,2秒钟后自动消失
    statusBar()->showMessage("加载完毕",2000);
}

Qt练习_第17张图片

把bin文件展示成图片显示出来

想看一个bin文件里的图片,就写了这个工具,宽度和高度设置图片的大小,时间设置自动播放的间隔,位置显示读取到文件的哪个位置,宽度高度和时间可以不用设置,有默认值,主要思路是把3个字节转化成3个0-255int值,这3个值为RGB值,构造颜色,然后把像素画出来
mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include 
#include 
#include 
#include 
#include 

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    //默认显示的宽度
    int width = 640;
    //默认显示的高度
    int height = 480;
    //记录已经显示的游标的位置
    int cursor = 0;
    //记录文件名字
    QString fileName;
    //记录bin文件的16进制编码
    QString fileData;
    //自动播放的定时器
    QTimer *timer;
private:
    Ui::MainWindow *ui;
public slots:
    //设置参数
    void set();
    //显示图片
    void showImage();
    //显示下一张图片
    void next();
    //设置自动播放
    void autoPlay();
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    timer = new QTimer(this);
    connect(ui->fileBtn,SIGNAL(clicked()),this,SLOT(showImage()));
    connect(ui->okBtn,SIGNAL(clicked()),this,SLOT(set()));
    connect(ui->nextBtn,SIGNAL(clicked()),this,SLOT(next()));
    connect(ui->checkBox,SIGNAL(stateChanged(int)),this,SLOT(autoPlay()));
    connect(timer,SIGNAL(timeout()),this,SLOT(next()));
    statusBar()->showMessage(tr("未设置参数"));
    ui->lineEdit_4->setReadOnly(true);
}
MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::showImage()
{
    cursor = 0;
    ui->lineEdit_4->setText(tr("00000000"));
    QString line;
    //file1文件保存的是上一次打开文件的地址
    QFile file1("/savefile.txt");
    if(file1.open(QIODevice::ReadOnly))
    {
        QTextStream in(&file1);
        line = in.readLine();
    }
    file1.close();
    QString fileName = QFileDialog::getOpenFileName(this,"请选择上传的文件",line,tr("Text files(*.bin)"));
    //上面的这一部分操作保证的是打开的是上一次的上传的文件
    //用户没选中文件,接着进行下面的操作就会崩溃,因为s是一个空字符串
    if(fileName.isEmpty())
        return;
    //将这次打开的文件的地址重新写入到保存文件地址的文件中,如果用户没有重新选择就不用保存
    if(file1.open((QIODevice::WriteOnly)))
    {
        QTextStream in(&file1);
        in<if(!file.open(QIODevice::ReadOnly))
        return;
    QImage mainimg(width,height,QImage::Format_ARGB32);
    QPainter painter(&mainimg);
    QByteArray temp1;
    while(!file.atEnd())
    {
        QByteArray temp = file.read(100);
        temp1.append(temp);
    }
    QByteArray store = temp1.toHex();
    fileData = store.data();
    int y = 0;
    for(int i=0; iint x = 0;
        for(int j=0; j6);
            cursor += 6;
            int a[3];
            for(int k=0; kif(k % 2 == 0)
                {
                    QString str = data.mid(k,2);
                    bool ok;
                    a[k/2] = str.toInt(&ok,16);
                }
            }
            QRectF r(x,y,1,1);
            QColor color(a[0],a[1],a[2]);
            painter.setPen(color);
            painter.drawRect(r);
        }
    }
    QPixmap mainmap=QPixmap::fromImage(mainimg);
    ui->label_3->setPixmap(mainmap);
    ui->label_3->setVisible(true);
    file.close();
}
void MainWindow::set()
{
    QString str1 = ui->lineEdit->text();
    width = str1.toInt();
    QString str2 = ui->lineEdit_2->text();
    height = str2.toInt();
    statusBar()->showMessage(tr("设置参数成功"));
}
void MainWindow::next()
{
    QString address = QString::number(cursor/2,16).toUpper();
    QString str;
    int len = address.length();
    for(int i=0; i<8-len; i++)
        str += "0";
    address = str + address;
    ui->lineEdit_4->setText(address);
    QImage mainimg(width,height,QImage::Format_ARGB32);
    QPainter painter(&mainimg);
    int y = 0;
    for(int i=0; iint x = 0;
        for(int j=0; jif(cursor + 5 > fileData.length())
            {
                statusBar()->showMessage(tr("读到文件尾部"));
                return;
            }
            QString data = fileData.mid(cursor,6);
            cursor += 6;
            int a[3];
            for(int k=0; kif(k % 2 == 0)
                {
                    QString str = data.mid(k,2);
                    bool ok;
                    a[k/2] = str.toInt(&ok,16);
                }
            }
            QRectF r(x,y,1,1);
            QColor color(a[0],a[1],a[2]);
            painter.setPen(color);
            painter.drawRect(r);
        }
    }
    QPixmap mainmap=QPixmap::fromImage(mainimg);
    ui->label_3->setPixmap(mainmap);
    ui->label_3->setVisible(true);
}
void MainWindow::autoPlay()
{
    if(ui->checkBox->isChecked())
    {
        int src;
        QString str = ui->lineEdit_3->text();
        if(str == "")
            src = 1000;
        else
            src = str.toInt();
        timer->setInterval(src);
        timer->start();
    }
    else
        timer->stop();
}

Qt练习_第18张图片

QXmlStreamReader和QXmlStreamWriter

#include 
#include 
#include 
#include 
#include 

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QFile file("my.xml");
    if(!file.open(QFile::WriteOnly | QFile::Text))
        return 1;
    QXmlStreamWriter stream(&file);
    stream.setAutoFormatting(true);
    stream.writeStartDocument();
    stream.writeStartElement("library");
    stream.writeStartElement("book");
    stream.writeAttribute("id","01");
    stream.writeTextElement("title","Qt");
    stream.writeTextElement("author","you");
    stream.writeEndElement();
    stream.writeStartElement("book");
    stream.writeAttribute("id","02");
    stream.writeTextElement("title","Linux");
    stream.writeTextElement("author","my");
    stream.writeEndElement();
    stream.writeEndDocument();
    file.close();
    qDebug() << "wirte finished";
    file.setFileName("my.xml");
    if(!file.open(QFile::ReadOnly | QFile::Text))
        return 1;
    QXmlStreamReader reader(&file);
    // 如果没有读到文档结尾,而且没有出现错误
    while (!reader.atEnd()) {
        // 读取下一个记号,它返回记号的类型
        QXmlStreamReader::TokenType type = reader.readNext();
        // 下面便根据记号的类型来进行不同的输出
        if (type == QXmlStreamReader::StartDocument)
            qDebug() << reader.documentEncoding() << reader.documentVersion();
        if (type == QXmlStreamReader::StartElement) {
            qDebug() << "<" << reader.name() << ">";
            if (reader.attributes().hasAttribute("id"))
                qDebug() << reader.attributes().value("id");
        }
        if (type == QXmlStreamReader::EndElement)
            qDebug() << " << reader.name() << ">";
        if (type == QXmlStreamReader::Characters && !reader.isWhitespace())
            qDebug() << reader.text();
    }
    // 如果读取过程中出现错误,那么输出错误信息
    if (reader.hasError()) {
        qDebug() << "error: " << reader.errorString();
    }
    file.close();
    return a.exec();
}

my.xml


<library>
    <book id="01">
        <title>Qttitle>
        <author>youauthor>
    book>
    <book id="02">
        <title>Linuxtitle>
        <author>myauthor>
    book>
library>

Qt练习_第19张图片

UDP发送和接收数据

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include 
#include 
#include 
#include 
#include 

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    QToolBar *tool;
    QAction *sendAction;
    QTimer *timer;
    QUdpSocket *sendSocket;
    QUdpSocket *receiveSocket;
    int port;

private:
    Ui::MainWindow *ui;
public slots:
    void setSend(bool flag);
    void sendMsg();
    void receiveData();
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include 
#include 
#include 
#include 

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    tool = addToolBar("tool");
    sendAction = new QAction("开始",this);
    sendAction->setCheckable(true);
    tool->addAction(sendAction);
    timer = new QTimer();
    sendSocket = new QUdpSocket(this);
    receiveSocket = new QUdpSocket(this);
    port = 5555;
    if (!receiveSocket->bind(port)) {
        QMessageBox::information(this,"error","udp socket create error");
        return;
    }
    connect(sendAction,SIGNAL(toggled(bool)),this,SLOT(setSend(bool)));
    connect(timer,SIGNAL(timeout()),this,SLOT(sendMsg()));
    connect(receiveSocket,SIGNAL(readyRead()),this,SLOT(receiveData()));
}

MainWindow::~MainWindow()
{
    delete ui;
}
//选中QAction就发送,不选中就不发送
void MainWindow::setSend(bool flag)
{
    if (flag) {
        timer->start(1000);
    } else {
        timer->stop();
    }
}
//发送数据到指定端口
void MainWindow::sendMsg()
{
    QString msg = ui->sendTextEdit->toPlainText();
    if (msg == "")
        return;
    //QSting的内容转成QByteArray,长度没有发生变化
    int len;

    /*
     * writeDatagram的三个参数的含义是要发送的数据,发动的地址,从哪个端口号发送
     * len发送成功返回发送的长度,发送失败返回-1
     */
    if ((len = sendSocket->writeDatagram(msg.toLatin1(),QHostAddress::Broadcast,port)) != msg.length()) {
        return;
    }
}
//从指定端口接收数据
void MainWindow::receiveData()
{
    while (receiveSocket->hasPendingDatagrams()) {
        QByteArray array;
        array.resize(receiveSocket->pendingDatagramSize());
        /*
         * array.data()返回的是char*类型
         * 读取array.size()长度的数据放到array.data()中
         */
        receiveSocket->readDatagram(array.data(),array.size());
        QString msg = array.data();
        ui->receiveTextEdit->insertPlainText(msg+"\n");
    }
}

Qt练习_第20张图片

QStackedWidget类和QListWidget混合使用

http://blog.csdn.net/a649518776/article/details/6636578

QToolBox使用

http://blog.sina.com.cn/s/blog_81cad10f0102v2zl.html

你可能感兴趣的:(Qt,Qt)