QT练习
集成开发环境:QT creator
完整程序资源免费下载:
【C++】QT小练习代码
一、QT入门与基础控件练习
1、入门练习
实现效果
:
程序结构
:
widget.h
:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QPushButton>
#include <QLineEdit>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public slots:
void movestr()
{
le1->setText(le->text());
}
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private:
Ui::Widget *ui;
QPushButton *pb;
QLineEdit *le;
QLineEdit *le1;
};
#endif // WIDGET_H
widget.cpp
:
#include "widget.h"
#include "ui_widget.h"
#include <QVBoxLayout>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
pb = new QPushButton("OK", this);
le = new QLineEdit(this);
le1 = new QLineEdit(this);
//pb->setGeometry(0, 100, 100, 50);
QVBoxLayout *vbox = new QVBoxLayout;
vbox->addWidget(le);
vbox->addWidget(le1);
vbox->addWidget(pb);
this->setLayout(vbox);
//connect(pb, SIGNAL(clicked(bool)),le,SLOT(clear()));
connect(pb, SIGNAL(clicked(bool)),this,SLOT(movestr()));
ui->setupUi(this);
}
Widget::~Widget()
{
delete ui;
}
2、布局管理器
目的
:观察不同布局的效果
程序结构
:
widget.h
:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QLineEdit>
#include <QPushButton>
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = 0);
~Widget();
private:
QLineEdit *le, *le1;
QPushButton *pb;
};
#endif // WIDGET_H
widget.cpp
:
#include "widget.h"
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QGridLayout>
#include <QFormLayout>
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
le = new QLineEdit(this);
le1 = new QLineEdit(this);
pb = new QPushButton("ok", this);
#if 0
QVBoxLayout *vbox = new QVBoxLayout;
vbox->addWidget(le);
vbox->addWidget(le1);
vbox->addWidget(pb);
this->setLayout(vbox);
#endif
#if 0
QHBoxLayout *hbox = new QHBoxLayout;
hbox->addWidget(le);
hbox->addWidget(le1);
hbox->addWidget(pb);
this->setLayout(hbox);
#endif
#if 0
QGridLayout *gbox = new QGridLayout;
gbox->addWidget(le, 0, 0);
gbox->addWidget(le1, 1, 1);
gbox->addWidget(pb, 2, 2);
this->setLayout(gbox);
#endif
QFormLayout *fbox = new QFormLayout;
fbox->addRow("user", le);
fbox->addRow("pawd", le1);
fbox->addRow("", pb);
this->setLayout(fbox);
}
Widget::~Widget()
{
}
3、输入与输出控件
实现效果
:
程序结构
:
widget.h
:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QLineEdit>
#include <QTextEdit>
#include <QComboBox>
#include <QTimeEdit>
#include <QDial>
#include <QSlider>
#include <QScrollBar>
#include <QLabel>
#include <QLCDNumber>
#include <QProgressBar>
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = 0);
~Widget();
private:
//input
QLineEdit *le;
QTextEdit *te;
QComboBox *cb;
QTimeEdit *timee;
QDial *dl;
QSlider *sd;
QScrollBar *sb;
//output
QLabel *lb;
QLabel *lb1;
QLCDNumber *lcd;
QProgressBar *pgb;
};
#endif // WIDGET_H
widget.cpp
:
#include "widget.h"
#include <QVBoxLayout>
#include <QHBoxLayout>
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
//input
le = new QLineEdit(this);
te = new QTextEdit;
cb = new QComboBox;
cb->addItem("read");
cb->addItem("write");
timee = new QTimeEdit;
dl = new QDial ;
sd = new QSlider;
sd->setOrientation(Qt::Horizontal);
sb = new QScrollBar;
sb->setOrientation(Qt::Horizontal);
QVBoxLayout *vbox = new QVBoxLayout;
vbox->addWidget(le);
vbox->addWidget(te);
vbox->addWidget(cb);
vbox->addWidget(timee);
vbox->addWidget(dl);
vbox->addWidget(sd);
vbox->addWidget(sb);
//output
lb = new QLabel("hello");
lb1 = new QLabel;
lcd = new QLCDNumber;
pgb = new QProgressBar;
QPixmap pix("1.png"); //自己找张图片放在项目生成的“build...”目录下
lb1->setFixedSize(100, 100);
lb1->setScaledContents(true); //图片大小自适应
lb1->setPixmap(pix);
QVBoxLayout *vbox1 = new QVBoxLayout;
vbox1->addWidget(lb);
vbox1->addWidget(lb1);
vbox1->addWidget(lcd);
vbox1->addWidget(pgb);
QHBoxLayout *hbox = new QHBoxLayout;
hbox->addLayout(vbox);
hbox->addLayout(vbox1);
this->setLayout(hbox);
connect(dl, SIGNAL(valueChanged(int)), lcd, SLOT(display(int)));
connect(dl, SIGNAL(valueChanged(int)), pgb, SLOT(setValue(int)));
connect(sd, SIGNAL(valueChanged(int)), lcd, SLOT(display(int)));
connect(sd, SIGNAL(valueChanged(int)), pgb, SLOT(setValue(int)));
}
Widget::~Widget()
{
}
4、按键
实现效果
:
程序结构
:
widget.h
:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QLineEdit>
#include <QPushButton>
#include <QCheckBox>
class Widget : public QWidget
{
Q_OBJECT
public slots:
void show_passwd(bool show_flag) //根据传递的bool值决定是否显示密码
{
if(show_flag)
le->setEchoMode(QLineEdit::Normal);
else
le->setEchoMode(QLineEdit::Password);
}
public:
Widget(QWidget *parent = 0);
~Widget();
private:
QLineEdit *le;
QCheckBox *ck; //决定密码是否显示
QPushButton *pb;
};
#endif // WIDGET_H
widget.cpp
:
#include "widget.h"
#include <QVBoxLayout>
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
le = new QLineEdit;
le->setEchoMode(QLineEdit::Password); //密码显示
ck = new QCheckBox("show passward");
pb = new QPushButton("clear");
QVBoxLayout *vbox = new QVBoxLayout;
vbox->addWidget(le);
vbox->addWidget(ck);
vbox->addWidget(pb);
this->setLayout(vbox);
connect(pb, SIGNAL(clicked(bool)), le, SLOT(clear()));
connect(ck, SIGNAL(clicked(bool)), this, SLOT(show_passwd(bool)));
}
Widget::~Widget()
{
}
6、容器
实现效果
:
程序结构
:
widget.h
:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QGroupBox>
#include <QRadioButton>
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = 0);
~Widget();
private:
QGroupBox *gb;
QRadioButton *r1, *r2, *r3; //单选按钮
};
#endif // WIDGET_H
widget.cpp
:
#include "widget.h"
#include <QVBoxLayout>
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
gb = new QGroupBox("choice", this);
r1 = new QRadioButton("aaaa");
r2 = new QRadioButton("bbbb");
r3 = new QRadioButton("cccc");
QVBoxLayout *vbox = new QVBoxLayout;
vbox->addWidget(r1);
vbox->addWidget(r2);
vbox->addWidget(r3);
gb->setLayout(vbox);
QVBoxLayout *mainbox = new QVBoxLayout;
mainbox->addWidget(gb);
this->setLayout(mainbox);
}
Widget::~Widget()
{
}
实现效果
:
程序结构
:
widget.h
:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QLabel>
#include <QScrollArea>
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = 0);
~Widget();
private:
QLabel *lb;
QScrollArea *sa;
};
#endif // WIDGET_H
widget.cpp
:
#include "widget.h"
#include <QVBoxLayout>
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
lb = new QLabel;
QPixmap pix("1.png"); //自行找图片添加在项目运行时生成的“bulid...”目录下
lb->setPixmap(pix);
sa = new QScrollArea;
sa->setWidget(lb);
QVBoxLayout *mainbox = new QVBoxLayout;
mainbox->addWidget(sa);
this->setLayout(mainbox);
}
Widget::~Widget()
{
}
实现效果
:
程序结构
:
widget.h
:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QToolBox>
#include <QPushButton>
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = 0);
~Widget();
private:
QToolBox *tb;
QPushButton *pb[3];
};
#endif // WIDGET_H
widget.cpp
:
#include "widget.h"
#include <QVBoxLayout>
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
tb = new QToolBox;
pb[0] = new QPushButton("aaa");
pb[1] = new QPushButton("bbb");
pb[2] = new QPushButton("ccc");
tb->addItem(pb[0], "11111");
tb->addItem(pb[1], "22222");
tb->addItem(pb[2], "33333");
QVBoxLayout *mainbox = new QVBoxLayout;
mainbox->addWidget(tb);
this->setLayout(mainbox);
}
Widget::~Widget()
{
}
实现效果
:
程序结构
:
widget.h
:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QTabWidget>
#include <QTextEdit>
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = 0);
~Widget();
private:
QTabWidget *tw;
QTextEdit *te1, *te2, *te3;
};
#endif // WIDGET_H
widget.cpp
:
#include "widget.h"
#include <QVBoxLayout>
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
tw = new QTabWidget;
te1 = new QTextEdit("11111");
te2 = new QTextEdit("22222");
te3 = new QTextEdit("33333");
tw->addTab(te1, "1.c");
tw->addTab(te2, "2.c");
tw->addTab(te3, "3.c");
QVBoxLayout *mainbox = new QVBoxLayout;
mainbox->addWidget(tw);
this->setLayout(mainbox);
}
Widget::~Widget()
{
}
实现效果
:
程序结构
:
widget.h
:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QStackedWidget>
#include <QTextEdit>
#include <QcomboBox>
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = 0);
~Widget();
private:
QStackedWidget *sw;
QTextEdit *te1, *te2, *te3;
QComboBox *cb;
};
#endif // WIDGET_H
widget.cpp
:
#include "widget.h"
#include <QVBoxLayout>
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
sw = new QStackedWidget;
te1 = new QTextEdit("111");
te2 = new QTextEdit("222");
te3 = new QTextEdit("333");
sw->addWidget(te1);
sw->addWidget(te2);
sw->addWidget(te3);
cb = new QComboBox;
cb->addItem("1111");
cb->addItem("2222");
cb->addItem("3333");
QVBoxLayout *mainbox = new QVBoxLayout;
mainbox->addWidget(sw);
mainbox->addWidget(cb);
this->setLayout(mainbox);
connect(cb, SIGNAL(activated(int)), sw, SLOT(setCurrentIndex(int)));
}
Widget::~Widget()
{
}
二、对话框练习
1、标准对话框
实现效果
:
程序结构
:
widget.h
:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QColorDialog>
#include <QErrorMessage>
#include <QFileDialog>
#include <QFontDialog>
#include <QInputDialog>
#include <QMessageBox>
#include <QProgressDialog>
#include <QPushButton>
#include <QTextEdit>
#include <QDebug>
class Widget : public QWidget
{
Q_OBJECT
public slots:
void setcolor()
{
QColor c = QColorDialog::getColor();
te->setTextColor(c);
}
void showerr()
{
QErrorMessage *msg = QErrorMessage::qtHandler();
msg->showMessage("error!");
}
void getfile()
{
QString filename = QFileDialog::getOpenFileName();
qDebug()<<filename;
te->setText(filename);
}
void setfont()
{
bool ok;
QFont myfont = QFontDialog::getFont(&ok);
if(ok)
te->setFont(myfont);
}
void getstr()
{
QString str = QInputDialog::getText(this, "xxxx", "yyyy");
te->setText(str);
}
void showmsg()
{
QMessageBox::information(this,"xxxx", "hello", "AAA");
}
void showprogress()
{
QProgressDialog p;
p.setValue(50);
p.exec();
}
public:
Widget(QWidget *parent = 0);
~Widget();
private:
QPushButton *btColor;
QPushButton *bterrm;
QPushButton *btfile;
QPushButton *btfont;
QPushButton *btinput;
QPushButton *btmsg;
QPushButton *btprg;
QTextEdit *te;
};
#endif // WIDGET_H
widget.cpp
:
#include "widget.h"
#include <QVBoxLayout>
#include <QHBoxLayout>
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
btColor = new QPushButton("setcolor");
bterrm = new QPushButton("errmsg");
btfile = new QPushButton("getfile");
btfont = new QPushButton("setfont");
btinput = new QPushButton("getstr");
btmsg = new QPushButton("msg");
btprg = new QPushButton("progress");
te = new QTextEdit;
QVBoxLayout *vbox = new QVBoxLayout;
vbox->addWidget(btColor);
vbox->addWidget(bterrm);
vbox->addWidget(btfile);
vbox->addWidget(btfont);
vbox->addWidget(btinput);
vbox->addWidget(btmsg);
vbox->addWidget(btprg);
QHBoxLayout *hbox = new QHBoxLayout;
hbox->addLayout(vbox);
hbox->addWidget(te);
this->setLayout(hbox);
connect(btColor, SIGNAL(clicked(bool)), this, SLOT(setcolor()));
connect(bterrm, SIGNAL(clicked(bool)), this, SLOT(showerr()));
connect(btfile, SIGNAL(clicked(bool)), this, SLOT(getfile()));
connect(btfont, SIGNAL(clicked(bool)), this, SLOT(setfont()));
connect(btinput, SIGNAL(clicked(bool)), this, SLOT(getstr()));
connect(btmsg, SIGNAL(clicked(bool)), this, SLOT(showmsg()));
connect(btprg, SIGNAL(clicked(bool)), this, SLOT(showprogress()));
}
Widget::~Widget()
{
}
2、自定义对话框
实现效果
:
程序结构
:
myqdialog.h
:
#ifndef MYQDIALOG_H
#define MYQDIALOG_H
#include <QDialog>
#include <QLineEdit>
#include <QPushButton>
#include <QMessageBox>
#include <QCheckBox>
/* 登录界面类 */
class myQDialog : public QDialog
{
Q_OBJECT
public slots:
void ok_pushed()
{
if(username->text() == "root" && passward->text() == "123456") //判断账号与密码是否正确
{
stat = true;
QMessageBox::information(this,"登录", "登录成功", "确定");
close();
}
else
{
QMessageBox::information(this,"登录", "密码或者账号错误", "确定");
}
}
void show_passward(bool show_passward_flag) //密码是否显示
{
if(show_passward_flag)
passward->setEchoMode(QLineEdit::Normal);
else
passward->setEchoMode(QLineEdit::Password);
}
public:
myQDialog();
static int getstat() //创建登录窗口
{
myQDialog a;
a.exec();
return a.stat;
}
private:
QLineEdit *username;
QLineEdit *passward;
QPushButton *pb;
QCheckBox *ck;
int stat = false; //ture:点击了登录按键并且账号与密码正确,跳转界面,false:没有点击登录按键或者账号与密码不正确
};
#endif // MYQDIALOG_H
widget.h
:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include "myqdialog.h"
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = 0);
~Widget();
};
#endif // WIDGET_H
myqdialog.cpp
:
#include "myqdialog.h"
#include <QFormLayout>
myQDialog::myQDialog()
{
/* 创建各个控件空间 */
username = new QLineEdit;
passward = new QLineEdit;
passward->setEchoMode(QLineEdit::Password);
ck = new QCheckBox("show passward");
pb = new QPushButton("登录");
/* 各控件排列 */
QFormLayout *fbox = new QFormLayout;
fbox->addRow("username", username);
fbox->addRow("passward", passward);
fbox->addWidget(ck);
fbox->addWidget(pb);
/* 显示 */
this->setLayout(fbox);
/* 控件功能 */
connect(pb, SIGNAL(clicked(bool)), this, SLOT(ok_pushed()));
connect(ck, SIGNAL(clicked(bool)), this, SLOT(show_passward(bool)));
}
widget.cpp
:
#include "widget.h"
#include "myqdialog.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
int s = myQDialog::getstat();
if(!s)
exit(0);
}
Widget::~Widget()
{
}
三、主窗口和事件处理
1、action、菜单栏、工具栏、菜单栏
实现效果
:
程序结构
:
mainwindow.h
:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QAction>
#include <QTextEdit>
#include <QLabel>
#include <QFileDialog>
#include <QColorDialog>
class MainWindow : public QMainWindow
{
Q_OBJECT
public slots:
void openf()
{
QString filename = QFileDialog::getOpenFileName();
te->setText(filename);
}
void copyf()
{
te->copy();
}
void pastf()
{
te->paste();
}
void setcf()
{
QColor ccc = QColorDialog::getColor();
te->setTextColor(ccc);
}
public:
MainWindow(QWidget *parent = 0);
~MainWindow();
private:
QAction *openfileact;
QAction *copyfileact, *pastfileact;
QAction *setcoloract;
//central
QTextEdit *te;
//status
QLabel *slb;
};
#endif // MAINWINDOW_H
mainwindow.cpp
:
#include "mainwindow.h"
#include <QMenu>
#include <QMenuBar>
#include <QToolBar>
#include <QStatusBar>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
//create actions
openfileact = new QAction(QIcon("open.png"),"open");
openfileact->setShortcut(QKeySequence(tr("Ctrl+o")));
copyfileact = new QAction(QIcon("copy.png"),"copy");
pastfileact = new QAction(QIcon("past.png"),"past");
setcoloract = new QAction(QIcon("color.png"),"setcolor");
//create meu
QMenu *fileMenu = menuBar()->addMenu(tr("&File"));
fileMenu->addAction(openfileact);
QMenu *editMenu = menuBar()->addMenu(tr("&Edit"));
editMenu->addAction(copyfileact);
editMenu->addAction(pastfileact);
QMenu *setMenu = menuBar()->addMenu(tr("&Set"));
setMenu->addAction(setcoloract);
//create tool
QToolBar *file = addToolBar("file");
file->addAction(openfileact);
QToolBar *tedit = addToolBar("edit");
tedit->addAction(copyfileact);
tedit->addAction(pastfileact);
QToolBar *tset = addToolBar("set");
tset->addAction(setcoloract);
//cenctrol
te = new QTextEdit();
te->setMinimumSize(640, 480);
setCentralWidget(te); //将编辑框增加到window当中
//statures
slb = new QLabel("1.txt");
QStatusBar *stb = statusBar();
stb->addWidget(slb);
connect(openfileact, SIGNAL(triggered(bool)), this, SLOT(openf()));
connect(copyfileact, SIGNAL(triggered(bool)), this, SLOT(copyf()));
connect(pastfileact, SIGNAL(triggered(bool)), this, SLOT(pastf()));
connect(setcoloract, SIGNAL(triggered(bool)), this, SLOT(setcf()));
}
MainWindow::~MainWindow()
{
}
2、事件
实现效果
:
程序结构
:
widget.h
:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QDebug>
#include <QMouseEvent>
#include <QWheelEvent>
#include <QTimerEvent>
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = 0);
~Widget();
void mousePressEvent(QMouseEvent *event) //鼠标点击事件
{
qDebug() << "pressssss:" << event->pos();
}
void mouseMoveEvent(QMouseEvent *event) //鼠标移动事件
{
qDebug() << "moving:" << event->pos();
}
void keyPressEvent(QKeyEvent *event) //键盘按下事件
{
qDebug() << "key: " << event->key();
}
void wheelEvent(QWheelEvent *event) //鼠标滚轮事件
{
qDebug() << "wheel: " << event->delta();
}
void timerEvent(QTimerEvent *event) //定时器事件
{
qDebug()<<"timer!";
}
};
#endif // WIDGET_H
widget.cpp
:
#include "widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
startTimer(1000);
}
Widget::~Widget()
{
}
3、绘图事件
实现效果
:
程序结构
:
widget.h
:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QDebug>
#include <QPainter>
#include <QTimerEvent>
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = 0);
~Widget();
void paintEvent(QPaintEvent *event)
{
QPainter p(this);
p.translate(this->width()/2, this->height()/2);
p.drawEllipse(QPoint(0, 0), 100, 100);
p.rotate((i++)*10);
p.drawLine(0, 0, 50, 50);
}
void timerEvent(QTimerEvent *event)
{
update();
}
private:
int i = 0;
};
#endif // WIDGET_H
widget.cpp
:
#include "widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
startTimer(1000);
}
Widget::~Widget()
{
}
4、绘图板
实现效果
:
程序结构
:
widget.h
:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QMouseEvent>
#include <QPainter>
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = 0);
~Widget();
void mousePressEvent(QMouseEvent *event)
{
startp = event->pos();
}
void mouseReleaseEvent(QMouseEvent *event)
{
saveit = true;
update();
}
void mouseMoveEvent(QMouseEvent *event)
{
endp = event->pos();
update();
}
void paintEvent(QPaintEvent *event)
{
if(saveit)
{
QPainter px(pix);
px.drawLine(startp, endp);
saveit = false;
}
QPainter p(this);
p.drawPixmap(0, 0, *pix);
p.drawLine(startp, endp);
}
private:
QPoint startp;
QPoint endp;
QPixmap *pix;
bool saveit = false;
};
#endif // WIDGET_H
widget.cpp
:
#include "widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
pix = new QPixmap(this->width(), this->height());
pix->fill();
}
Widget::~Widget()
{
}
5、事件过滤
实现效果
:
程序结构
:
widget.h
:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QLabel>
#include <QPushButton>
#include <QFileDialog>
#include <QStringList>
#include <QEvent>
#include <QKeyEvent>
class Widget : public QWidget
{
Q_OBJECT
public slots:
void openfiles()
{
index = 0;
files = QFileDialog::getOpenFileNames();
QPixmap pix(files[index]);
lb->setPixmap(pix);
}
void showr() //显示向右的下一张图片
{
if(index + 1 < files.length())
{
QPixmap pix(files[++index]);
lb->setPixmap(pix);
}
else
{
index = 0;
QPixmap pix(files[index]);
lb->setPixmap(pix);
}
}
void showl() //显示向左的下一张图片
{
if(index > 0 )
{
QPixmap pix(files[--index]);
lb->setPixmap(pix);
}
else
{
index = files.length()-1;
QPixmap pix(files[index]);
lb->setPixmap(pix);
}
}
bool eventFilter(QObject *watched, QEvent *event) //事件过滤函数
{
lb->setFocus();
if(watched == lb)
{
if(event->type() == QEvent::KeyPress)
{
QKeyEvent *keyevent = static_cast<QKeyEvent*>(event);
if(keyevent->key() == Qt::Key_Left) //l 按键"<"
showl();
else if(keyevent->key() == Qt::Key_Right) //r //按键">"
showr();
return true;
}
}
return QWidget::eventFilter(watched, event);
}
public:
Widget(QWidget *parent = 0);
~Widget();
private:
QLabel *lb;
QPushButton *lbt, *rbt, *openbt;
QStringList files;
int index;
};
#endif // WIDGET_H
widget.cpp
:
#include "widget.h"
#include <QVBoxLayout>
#include <QHBoxLayout>
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
lb = new QLabel;
lb->setMinimumSize(640, 480);
lb->setScaledContents(true); //大小自适应
lb->setFocus();
lb->installEventFilter(this);
lbt = new QPushButton("<");
rbt = new QPushButton(">");
openbt = new QPushButton("open");
QHBoxLayout *hbox = new QHBoxLayout;
hbox->addStretch(); //按键集中
hbox->addWidget(lbt);
hbox->addWidget(openbt);
hbox->addWidget(rbt);
hbox->addStretch();
QVBoxLayout *vbox = new QVBoxLayout;
vbox->addWidget(lb);
vbox->addLayout(hbox);
setLayout(vbox);
connect(openbt, SIGNAL(clicked(bool)), this, SLOT(openfiles()));
connect(rbt, SIGNAL(clicked(bool)), this, SLOT(showr()));
connect(lbt, SIGNAL(clicked(bool)), this, SLOT(showl()));
}
Widget::~Widget()
{
}
四、文件与进程、线程
1、文件
实现效果
:
程序结构
:
widget.h
:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QTextEdit>
#include <QLineEdit>
#include <QPushButton>
#include <QFileDialog>
#include <Qfile>
#include <QTextStream>
class Widget : public QWidget
{
Q_OBJECT
public slots:
void showfile()
{
QString filename = QFileDialog::getOpenFileName();
le->setText(filename);
QFile file(filename); //读取文件内容并打印在编辑框里
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
return;
while (!file.atEnd()) {
QByteArray line = file.readLine();
//process_line(line);
te->append(line);
}
}
public:
Widget(QWidget *parent = 0);
~Widget();
private:
QTextEdit *te;
QLineEdit *le;
QPushButton *pb;
};
#endif // WIDGET_H
widget.cpp
:
#include "widget.h"
#include <QVBoxLayout>
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
te = new QTextEdit;
te->setMinimumSize(640, 480);
le = new QLineEdit;
pb = new QPushButton("open");
QVBoxLayout *vbox = new QVBoxLayout;
vbox->addWidget(te);
vbox->addWidget(le);
vbox->addWidget(pb);
setLayout(vbox);
connect(pb, SIGNAL(clicked(bool)), this, SLOT(showfile()));
}
Widget::~Widget()
{
}
2、文件目录
实现效果
:
程序结构
:
main.cpp
:
#include <QCoreApplication>
#include <QDir>
#include <iostream>
#include <QFileInfo>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QDir dir;
QFileInfoList list = dir.entryInfoList(); //得到文件夹下的文件列表
std::cout << " Bytes Filename" << std::endl;
for (int i = 0; i < list.size(); ++i) { //遍历文件夹下的文件
QFileInfo fileInfo = list.at(i);
std::cout << fileInfo.size() << "\t" <<fileInfo.fileName().toStdString().c_str(); //打印文件大小与文件名
std::cout << std::endl;
}
return a.exec();
}
3、进程
实现效果
:
程序结构
:
widget.h
:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QLineEdit>
#include <QPushButton>
#include <QFileDialog>
#include <QProcess>
#include <QStringList>
class Widget : public QWidget
{
Q_OBJECT
public slots:
void showfile()
{
QString filename = QFileDialog::getOpenFileName();
le->setText(filename); //得到文件名
QStringList arg = {filename};
QProcess ppp;
ppp.execute("notepad", arg); //启动txt阅读器
}
public:
Widget(QWidget *parent = 0);
~Widget();
private:
QLineEdit *le;
QPushButton *pb;
};
#endif // WIDGET_H
widget.cpp
:
#include "widget.h"
#include <QVBoxLayout>
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
le = new QLineEdit;
pb = new QPushButton("showtxt");
QVBoxLayout *vbox = new QVBoxLayout;
vbox->addWidget(le);
vbox->addWidget(pb);
setLayout(vbox);
connect(pb, SIGNAL(clicked(bool)), this, SLOT(showfile()));
}
Widget::~Widget()
{
}
4、线程
实现效果
:
程序结构
:
widget.h
:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QProgressBar>
#include "mythread.h"
#include "mythread1.h"
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = 0);
~Widget();
private:
QProgressBar *p1, *p2;
mythread *t1;
mythread1 *t2;
};
#endif // WIDGET_H
mythread.h
:
#ifndef MYTHREAD_H
#define MYTHREAD_H
#include <QThread>
class mythread : public QThread
{
Q_OBJECT
signals:
downloaded(int);
public:
mythread();
void run()
{
for(int i=0;i < 100;++i)
{
emit downloaded(i);
QThread::sleep(1);
}
}
};
#endif // MYTHREAD_H
mythread1.h
:
#ifndef MYTHREAD1_H
#define MYTHREAD1_H
#include <QThread>
class mythread1 : public QThread
{
Q_OBJECT
signals:
downloaded(int);
public:
mythread1();
void run()
{
for(int i=0;i < 100;++i)
{
emit downloaded(i);
QThread::sleep(2);
}
}
};
#endif // MYTHREAD1_H
widget.cpp
:
#include "widget.h"
#include <QVBoxLayout>
#include <QThread>
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
p1 = new QProgressBar;
p2 = new QProgressBar;
QVBoxLayout *vbox = new QVBoxLayout;
vbox->addWidget(p1);
vbox->addWidget(p2);
setLayout(vbox);
t1 = new mythread;
t2 = new mythread1;
connect(t1, SIGNAL(downloaded(int)), p1, SLOT(setValue(int)));
connect(t2, SIGNAL(downloaded(int)), p2, SLOT(setValue(int)));
t1->start();
t2->start();
}
Widget::~Widget()
{
}
5、线程同步
实现效果
:
程序结构
:
hello.h
:
#ifndef HELLO_H
#define HELLO_H
#include <QThread>
#include <QDebug>
#include <QSemaphore>
class hello : public QThread
{
Q_OBJECT
public:
hello(QSemaphore *sem);
void run()
{
while(1)
{
qDebug() << "hello";
QThread::sleep(1);
//v
this->sem->release(1);
}
}
private:
QSemaphore *sem;
};
#endif // HELLO_H
world.h
:
#ifndef WORLD_H
#define WORLD_H
#include <QThread>
#include <QDebug>
#include <QSemaphore>
class world : public QThread
{
Q_OBJECT
public:
world(QSemaphore *sem);
void run()
{
while(1)
{
//p
this->sem->acquire(1);
qDebug() << "world";
}
}
private:
QSemaphore *sem;
};
#endif // WORLD_H
main.cpp
:
#include <QCoreApplication>
#include "hello.h"
#include "world.h"
#include <QSemaphore>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QSemaphore sem;
hello hello(&sem);
world world(&sem);
hello.start();
world.start();
return a.exec();
}
6、互斥
实现效果
:
程序结构
:
thread_rev.h
:
#ifndef THREAD_REV_H
#define THREAD_REV_H
#include <QThread>
#include <QDebug>
#include <QMutex>
class thread_rev : public QThread
{
Q_OBJECT
public:
thread_rev(char *p, QMutex *lock):arr(p), arr_lock(lock){}
void run()
{
while(1)
{
arr_lock->lock();
for(int i=0;i < 5;++i)
{
arr[i] ^= arr[9-i];
arr[9-i] ^= arr[i];
arr[i] ^= arr[9-i];
}
arr_lock->unlock();
}
}
private:
char *arr;
QMutex *arr_lock;
};
#endif // THREAD_REV_H
threadshow.h
:
#ifndef THREADSHOW_H
#define THREADSHOW_H
#include <QThread>
#include <QDebug>
#include <QMutex>
class threadshow : public QThread
{
Q_OBJECT
public:
threadshow(char *p, QMutex *lock):arr(p), arr_lock(lock){}
void run()
{
while(1)
{
arr_lock->lock();
qDebug() << arr;
arr_lock->unlock();
}
}
private:
char *arr;
QMutex *arr_lock;
};
#endif // THREADSHOW_H
main.cpp
:
#include <QCoreApplication>
#include "threadshow.h"
#include "thread_rev.h"
#include <QMutex>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
char arr[] = "0123456789";
QMutex arr_lock;
threadshow t1(arr, &arr_lock);
thread_rev t2(arr, &arr_lock);
t1.start();
t2.start();
return a.exec();
}
五、网络编程
1、UDP编程
实现效果
:
客户端:
程序结构
:
widget.h
:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QTextEdit>
#include <QLineEdit>
#include <QPushButton>
#include <QUdpSocket>
#include <QHostAddress>
class Widget : public QWidget
{
Q_OBJECT
public slots:
void senddata()
{
udpsock->writeDatagram(le->text().toStdString().c_str(), QHostAddress("192.168.43.120"), 8888);
}
void recvdata()
{
QByteArray datagram;
datagram.resize(udpsock->pendingDatagramSize());
QHostAddress sender;
quint16 senderPort;
udpsock->readDatagram(datagram.data(), datagram.size(),
&sender, &senderPort);
te->append(datagram);
}
public:
Widget(QWidget *parent = 0);
~Widget();
private:
QTextEdit *te;
QLineEdit *le;
QPushButton *pb;
QUdpSocket *udpsock;
};
#endif // WIDGET_H
widget.cpp
:
#include "widget.h"
#include <QVBoxLayout>
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
te = new QTextEdit;
le =new QLineEdit;
pb = new QPushButton("send");
QVBoxLayout *vbox = new QVBoxLayout;
vbox->addWidget(te);
vbox->addWidget(le);
vbox->addWidget(pb);
setLayout(vbox);
udpsock = new QUdpSocket;
connect(pb, SIGNAL(clicked(bool)), this, SLOT(senddata()));
connect(udpsock, SIGNAL(readyRead()), this, SLOT(recvdata()));
}
Widget::~Widget()
{
}
额外添加
:
服务器:
程序结构
:
udp_Server.h
:
#ifndef UDP_SERVER_H
#define UDP_SERVER_H
#include <QObject>
#include <QUdpSocket>
#include <QDebug>
class udp_Server : public QObject
{
Q_OBJECT
public:
explicit udp_Server(QObject *parent = 0);
void init()
{
udpsock = new QUdpSocket(this);
udpsock->bind(QHostAddress::AnyIPv4, 8888);
connect(udpsock, SIGNAL(readyRead()),
this, SLOT(readPendingDatagrams()));
qDebug() << "init ok....";
}
signals:
public slots:
void readPendingDatagrams()
{
while (udpsock->hasPendingDatagrams()) {
QByteArray datagram;
datagram.resize(udpsock->pendingDatagramSize());
QHostAddress sender;
quint16 senderPort;
udpsock->readDatagram(datagram.data(), datagram.size(),
&sender, &senderPort);
qDebug() << "recv:" << datagram;
//processTheDatagram(datagram);
udpsock->writeDatagram(datagram.data(), datagram.size(),
sender, senderPort);
}
}
private:
QUdpSocket *udpsock;
};
#endif // UDP_SERVER_H
main.cpp
:
#include <QCoreApplication>
#include "udp_server.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
udp_Server server;
server.init();
return a.exec();
}
2、TCP编程
客户端:
程序结构
:
widget.h
:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QTextEdit>
#include <QLineEdit>
#include <QPushButton>
#include <QTcpSocket>
class Widget : public QWidget
{
Q_OBJECT
public slots:
void senddata()
{
tcpsock->write(le->text().toStdString().c_str());
}
void recvdata()
{
QByteArray buf = tcpsock->readAll();
te->append(buf);
}
public:
Widget(QWidget *parent = 0);
~Widget();
private:
QTextEdit *te;
QLineEdit *le;
QPushButton *pb;
QTcpSocket *tcpsock;
};
#endif // WIDGET_H
widget.cpp
:
#include "widget.h"
#include <QVBoxLayout>
#include <QHostAddress>
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
te = new QTextEdit;
le = new QLineEdit;
pb = new QPushButton("send");
QVBoxLayout *vbox = new QVBoxLayout;
vbox->addWidget(te);
vbox->addWidget(le);
vbox->addWidget(pb);
setLayout(vbox);
tcpsock = new QTcpSocket;
//connect to server
tcpsock->connectToHost(QHostAddress("192.168.43.120"), 8887);
connect(pb, SIGNAL(clicked(bool)), this, SLOT(senddata()));
connect(tcpsock, SIGNAL(readyRead()), this, SLOT(recvdata()));
}
Widget::~Widget()
{
}
服务器:
tcpServer.h
:
#ifndef TCPSERVER_H
#define TCPSERVER_H
#include <QObject>
#include <QTcpServer>
#include <QTcpSocket>
#include <QDebug>
class tcpServer : public QObject
{
Q_OBJECT
public:
explicit tcpServer(QObject *parent = 0);
signals:
public slots:
void newconnected()
{
qDebug() << "connected new....";
clientsock = ser->nextPendingConnection();
connect(clientsock, SIGNAL(readyRead()), this, SLOT(readdata()));
}
void readdata()
{
QByteArray buf = clientsock->readAll();
qDebug() << "recv:" << buf;
clientsock->write(buf);
}
private:
QTcpServer *ser;
QTcpSocket *clientsock;
};
#endif // TCPSERVER_H
tcpServer.cpp
:
#include "tcpserver.h"
#include <QHostAddress>
tcpServer::tcpServer(QObject *parent) : QObject(parent)
{
ser = new QTcpServer;
ser->listen(QHostAddress::AnyIPv4, 8887);
connect(ser, SIGNAL(newConnection()), this, SLOT(newconnected()));
ser->waitForNewConnection();
}
main.cpp
:
#include <QCoreApplication>
#include <tcpserver.h>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
tcpServer *server;
return a.exec();
}