Qt练习
发布日期:2021-06-29 11:58:01 浏览次数:2 分类:技术文章

本文共 49938 字,大约阅读时间需要 166 分钟。

测试按钮

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_OBJECTpublic: 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; i
child(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; i
child(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; i
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_OBJECTpublic: 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();}

这里写图片描述

进度条和进度条对话框

progressdlg.h

#ifndef PROGRESSDLG_H#define PROGRESSDLG_H#include 
#include
#include
#include
#include
#include
#include
#include
class ProgressDlg : public QDialog{ Q_OBJECTpublic: 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; } }}

这里写图片描述这里写图片描述

电子时钟

digiclock.h

#ifndef DIGICLOCK_H#define DIGICLOCK_H#include 
class DigiClock : public QLCDNumber{ Q_OBJECTpublic: 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(){}

这里写图片描述

带标签的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(){}

这里写图片描述

参考资料:

可扩展对话框练习

extensiondlg.h

#ifndef EXTENSIONDLG_H#define EXTENSIONDLG_H#include 
#include
class ExtensionDlg : public QDialog{ Q_OBJECTpublic: 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控制台应用

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()<

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<
<
<
<<90<

这里写图片描述

读写二进制文件

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<
>name>>birthday>>age; qDebug()<
<
<

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

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()<
<
<<"\t"<
<
1) { path = args[1]; } else { path = QDir::currentPath(); } qDebug()<
<

这里写图片描述

文件显示器

fileview.h

#ifndef FILEVIEW_H#define FILEVIEW_H#include 
#include
#include
#include
#include
#include
#include
class FileView : public QDialog{ Q_OBJECTpublic: 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
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);}

这里写图片描述

获取文件信息

fileinfo.h

#ifndef FILEINFO_H#define FILEINFO_H#include 
#include
#include
#include
#include
class FileInfo : public QDialog{ Q_OBJECTpublic: 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_OBJECTpublic: 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_OBJECTpublic: 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"));}

这里写图片描述

QTableWidget

表格类一般用到3个类,一个是QTableView可以定义的部分很多,一个是QTableWidget,一个是QTableWidgetItem(表格里面插入的内容),注意:要设置QTableWidget的行数和列数添加的Item才会显示出来

参考博客1:
参考博客2:
参考博客3:

mainwindow.cpp

#include "mainwindow.h"#include 
#include
#include
#include
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);}

这里写图片描述

QTabWidget

mainwindow.cpp

#include "mainwindow.h"#include 
#include
#include
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);}

这里写图片描述

QTreeWidget

mainwindow.cpp

#include "mainwindow.h"#include 
#include
#include
#include
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
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);}

这里写图片描述

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

这里写图片描述

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

这里写图片描述

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

mainwindow.h

#ifndef MAINWINDOW_H#define MAINWINDOW_H#include 
namespace Ui {class MainWindow;}class MainWindow : public QMainWindow{ Q_OBJECTpublic: 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
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
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
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);}

这里写图片描述

把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_OBJECTpublic: 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<
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; i
fileData.length()) { statusBar()->showMessage(tr("读到文件尾部")); return; } QString data = fileData.mid(cursor,6); cursor += 6; int a[3]; for(int k=0; k
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();}

这里写图片描述

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() << "
"; if (type == QXmlStreamReader::Characters && !reader.isWhitespace()) qDebug() << reader.text(); } // 如果读取过程中出现错误,那么输出错误信息 if (reader.hasError()) { qDebug() << "error: " << reader.errorString(); } file.close(); return a.exec();}

my.xml

Qt
you
Linux
my

这里写图片描述

UDP发送和接收数据

mainwindow.h

#ifndef MAINWINDOW_H#define MAINWINDOW_H#include 
#include
#include
#include
#include
namespace Ui {class MainWindow;}class MainWindow : public QMainWindow{ Q_OBJECTpublic: 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"); }}

这里写图片描述

QStackedWidget类和QListWidget混合使用

QToolBox使用

转载地址:https://blog.csdn.net/zzti_erlie/article/details/52576578 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Qt串口助手开发
下一篇:Qt常见错误

发表评论

最新留言

感谢大佬
[***.8.128.20]2024年04月29日 12时31分21秒