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();
}
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;
}
}
}
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();
}
可以用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()
{
}
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()
{
}
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()
{
}
参考资料: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控制台应用
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();
}
#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();
}
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();
}
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);
}
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"));
}
表格类一般用到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);
}
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);
}
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);
}
#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);
}
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;
}
}
}
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);
}
想看一个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();
}
#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>
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");
}
}
http://blog.csdn.net/a649518776/article/details/6636578
http://blog.sina.com.cn/s/blog_81cad10f0102v2zl.html