一、学习qt的方式:看书+网课
学习网站:http://c.biancheng.net/qt/
网课基础教程:https://www.bilibili.com/video/BV1g4411H78N?p=14
二、笔记
1.建工程建项目
略略略
2.qt程序代码
前面几章的学习用代码写控件,后面用拖拽的方式做
button按钮、信号和槽:第一章学习代码:熟悉各种接口的调用。其他.h .cpp省略
//mywidget.h
#ifndef MYWIDGET_H
#define MYWIDGET_H
#include <QWidget>
class myWidget : public QWidget
{
Q_OBJECT
public:
myWidget(QWidget *parent = 0);
~myWidget();
};
#endif // MYWIDGET_H
//mywidget.cpp
#include "mywidget.h"
#include "mypushbutton.h"
#include <QPushButton>
#include <QDebug> //qDebug() -> printf()
myWidget::myWidget(QWidget *parent)
: QWidget(parent)
{
//创建一个按钮
QPushButton *butten1 = new QPushButton;
//butten1->show();//show以顶层的方式弹出窗口控件
butten1->setParent(this);//butten1依赖在myWidget中
//显示文本
butten1->setText("按钮1");
//创建第二个按钮
QPushButton *butten2 = new QPushButton("按钮2",this);
butten2->move(100,0);//移动按钮
//按钮的大小重置
butten2->resize(100,50);
//重置窗口大小
resize(1500,1000);
//设置固定窗口大小
setFixedSize(500,300);//用户不可以拖拽窗口大小
//设置窗口标题
setWindowTitle("赵达伟的窗口");
//定义一个我自己的按钮类
myPushButton * button3 = new myPushButton;
button3->setParent(this);
button3->setText("My Button");
button3->move(0,200);
//信号和槽
//参数:信号发送者,发送的信号(函数地址),信号接收者,处理的槽函数
//connect(button3,button3->clicked,this,this->close);//
connect(button3,&QPushButton::clicked,this,&myWidget::close);//两种方式都可以
}
myWidget::~myWidget()
{
}
0417 学习lambda表达式
自定义信号和槽,代码
//widget.h
#include <QPushButton>
#include "student.h"
#include "teacher.h"
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private:
Ui::Widget *ui;
Teacher *tea;
Student *stu;
void ClassOver();
};
#endif // WIDGET_H
//widget.cpp
#include "widget.h"
#include "ui_widget.h"
//Teacher类
//Student类
//需求:下课后老师触发信号(饿了),学生相应信号(买饭)
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//创建老师对象
this->tea = new Teacher(this);
//创建学生对象
this->stu = new Student(this);
//信号和槽的connect:老师饿了,学生说吃饭
//connect(this->tea,this->tea->Hungry,this->stu,this->stu->Eat);
//调用下课的函数
//this->ClassOver();
//信号和槽的connect:带参数
//指针指向地址:函数指针
void (Teacher:: *teacherSignal)(QString) = this->tea->Hungry;
void (Student:: *studentSlot)(QString) = this->stu->Eat;
connect(this->tea,teacherSignal,this->stu,studentSlot);
//调用下课的函数
//this->ClassOver();
QPushButton *button1 = new QPushButton("下课",this);
button1->resize(50,50);
this->resize(500,250);
//点击按钮 触发下课
connect(button1,button1->clicked,this,this->ClassOver);
QPushButton *button2 = new QPushButton("吃饭",this);
button2->resize(50,50);
button2->move(100,0);
//无参信号
void (Teacher:: *teacherSignal2)(void) = this->tea->Hungry;
void (Student:: *studentSlot2)(void) = this->stu->Eat;
connect(this->tea,teacherSignal2,this->stu,studentSlot2);
//信号连接信号:点击按钮的信号 触发一个信号
connect(button2,button2->clicked,this->tea,teacherSignal2);
//断开信号
//disconnect();
//拓展
//一个信号连接多个槽,多个信号可以连接一个槽
//信号和槽的参数必须一一对应
//信号的参数个数可以多余槽函数的参数
//Qt4无参版本 连接无参版本
connect(this->tea,SIGNAL(hungry()),stu,SLOT(Eat()));
//Qt4版本优点:直观 缺点:类型不检测
//0417 lambda表达式;mutable关键字用于修饰值传递的变量,修改的是开呗,而不是本体
[=](){
button1->setText("下课下课");
}();
//[]
//() 重载参数
int ret = []()->int{return 1000;}();
qDebug() << "ret = " << ret;
//利用lambda表达式 实现点击按钮关闭窗口
QPushButton * button3 = new QPushButton(this);
button3->setText("关闭");
button3->move(200,200);
connect(button3,button3->clicked,this,[=](){
//关闭窗口
this->close();
//可以写多个函数:相当于一个信号触发多个槽函数
button3->setText("已点击关闭");
});
}
void Widget::ClassOver()
{
//下课,触发老师饿了的信号
//emit this->tea->Hungry();
//带参数的信号
emit this->tea->Hungry("米饭和鱼香肉丝");
}
Widget::~Widget()
{
delete ui;
}
0418 17:QMainWindow菜单栏工具栏
代码:
#include "mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
//重置窗口大小
this->setWindowTitle("赵达伟的qt学习");
resize(600,400);
/*******************************************/
//菜单栏:只能有一个
QMenuBar* bar = menuBar();
setMenuBar(bar);//空栏 不显示
//创建菜单
QMenu* fileMenu = bar->addMenu("文件");
QMenu* editMenu = bar->addMenu("编辑");
//创建菜单项
QAction* fileMenu_new = fileMenu->addAction("新建");
QAction* fileMenu_open = fileMenu->addAction("打开");
QAction* editMenu_change = editMenu->addAction("修改");
QAction* editMenu_add = editMenu->addAction("增加");
//添加分隔线
editMenu->addSeparator();
QAction* editMenu_delete = editMenu->addAction("删除");
/*******************************************/
//工具栏
QToolBar * toolbar = new QToolBar(this);
addToolBar(Qt::LeftToolBarArea,toolbar);//将工具栏放置于左边
//后期设置 只允许左右停靠
toolbar->setAllowedAreas(Qt::LeftToolBarArea | Qt::RightToolBarArea);
//设置浮动
toolbar->setFloatable(false);
//设置移动(总开关):如果这个false,所有的东西都关闭
toolbar->setMovable(true);
//工具栏中设置内容
//toolbar->addAction();
QAction* toolbar_1 = toolbar->addAction("工具栏1");
toolbar->addSeparator();
QAction* toolbar_2 = toolbar->addAction("工具栏2");
toolbar->addSeparator();
QAction* toolbar_3 = toolbar->addAction("工具栏3");
//工具栏中添加控件
QPushButton * but1 = new QPushButton("按钮1",this);
toolbar->addWidget(but1);
//0420状态栏 :最多一个
QStatusBar * stBar = statusBar();
//放置到窗口中
setStatusBar(stBar);
//放些标签控件
QLabel *lab1 = new QLabel("左状态栏1",this);
stBar->addWidget(lab1);
QLabel * lab2 = new QLabel("右状态栏1",this);
stBar->addPermanentWidget(lab2);
//铆接部件(浮动窗口)
QDockWidget* dockwidget = new QDockWidget("浮动窗口",this);
addDockWidget(Qt::BottomDockWidgetArea,dockwidget);
//设置中心部件 : 只能有一个
QTextEdit * textedit = new QTextEdit(this);
setCentralWidget(textedit);//设置了这个,上面的浮动窗口就到下面了,因为只能有一个中心;
}
MainWindow::~MainWindow()
{
}
资源文件
给按钮加个图标啦什么的,本例中在项目中添加一个图片的文件夹,将文件夹添加到项目中,使用的时候就还可以根据路径使用了。
代码
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
//ui->actionnew->setIcon(QIcon("D:/Qt/MyProg/05SourceFile/addnew.png"));
//添加资源文件
//使用资源文件 ": + 前缀名+文件"
ui->actionnew->setIcon(QIcon(":/Image/addnew.png"));
}
MainWindow::~MainWindow()
{
delete ui;
}
对话框
代码:
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
//点击新建按钮,弹出一个对话框
connect(ui->actionew,&QAction::triggered,[=](){
//对话框:模态(不可以对其他窗口进行操作) 非模态(可以操作别的对话框)
//QDialog dlg(this);
// dlg.resize(200,100);
//dlg.exec();
// qDebug("模态对话框退出");
//非模态对话框
//QDialog * dlg2 = new QDialog(this);//这里用new 放在堆上;否则connect结束对象销毁
//dlg2->resize(200,100);
// dlg2->show();
//dlg2->setAttribute(Qt::WA_DeleteOnClose);//关闭对话框后delete对象(55号 熟悉)
//消息对话框
//错误对话框
// QMessageBox::critical(this,"critical","错误!");
//信息对话框
// QMessageBox::information(this,"title","信息");
//提问对话框:参数:parent 标题 提示内容 按键类型 默认关联回车按键
// if(QMessageBox::Save == QMessageBox::question(this,"请选择"," Are You OK?",QMessageBox::Yes|QMessageBox::Cancel,QMessageBox::Yes) )
// {
// qDebug("用户选择了保存");
// //...一堆操作
// }
// else
// {
// qDebug("用户选择了取消");
// //...一堆操作
// }
//警告对话框
// QMessageBox::warning(this,"警告","快跑!");
//其他对话框
QColor color = QColorDialog::getColor(QColor(255,255,255));
qDebug() << color.red();
//文件对话框 参数:1.parent 2.title 3.默认打开路径 4.过滤文件格式 返回值:路径
QString str = QFileDialog::getOpenFileName(this,"打开文件title","D:\Qt\MyProg\05SourceFile\Image");
//字体对话框
bool flag = true;
QFont font = QFontDialog::getFont(&flag,QFont("宋体",36));
qDebug() << "字体:"<<font.pointSize()<<"字号:"<<font.pointSize();
});
}
MainWindow::~MainWindow()
{
delete ui;
}