一、窗口中添加按钮
1.首先在mainwindow.h
文件中添加<QPushButton>
类
2.在MainWindow
类声明两个QPushButton对象的指针
private:
QPushButton *btn1;
QPushButton *btn2;
3.在mainwindow.cpp
文件中为QPushButton对象动态分配内存空间
4.对btn1,btn2做一些初始化
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
btn1 = new QPushButton("1",this);
btn1->setIcon(QIcon("D:\\nk.png"));
btn1->move(100,0);
btn2 = new QPushButton;
btn2->setParent(this);
btn2->setText("2");
btn2->move(200,200);
btn2->resize(80,40);
}
二、窗口设置
在MainWindow
类中通过this指针+方法,对窗口进行设置
this->setWindowTitle("我的程序");
this->resize(600,800);
三、信号和槽函数
1.一个基础的信号和槽
语法connect(button, &QPushButton::clicked, this, &MainWindow::close);
参数:1.信号的发送者 2.发送的信号(函数地址) 3.信号接收者 4.处理的槽函数
参数 | 注意事项 |
---|---|
信号发出者 | 此参数是一个指针 |
& + 信号发出者类的名字 + ::+ 信号的名字 | 信号发出者内部的信号(查看帮助文档,找不到就在父类中查找) |
this 信号接收者 | 也是一个指针 |
& + 信号接收者类的名字 + ::+ 槽的名字 | 信号接收者内部的信号 |
信号槽优点:信号的发送端与接收端本身是没有关联的,通过connect将两端耦合在一起
2.自定义槽
事例:点击btn1改变btn2中的文字内容
方法:
1.思路:让另一个对象接受btn1发出的信号,该对象改变btn2里的文本内容
2.引入自定义槽函数,该函数的作用是改变btn2中文字的内容
3.定义槽函数:
①在mainwindow.h
文件中的class MainWindow
类下声明该函数
public:
//自定义槽函数
void slot();
②在mainwindow.cpp
文件中的MainWindow
外实现该函数的改名操作
void MainWindow::slot()
{
btn2->setText("改名");
}
③在mainwindow.cpp
文件中的MainWindow
内部建立信号和槽
connect(btn1,&QPushButton::clicked,this,&MainWindow::slot);
注意事项:
1.槽函数需要与信号相对应
2.信号和槽没有返回值
3.两者传递的参数要一致
4.信号函数的参数传给槽函数
3.自定义信号
事例:在窗口一中按下按钮隐藏自己,显示另一个窗口(只能看见一个窗口)
预备操作
1.创建一个新的窗口类(选择c++ class,继承qweight)
2.子窗口头文件中创建按钮对象,并在cpp文件中实现
头文件
#include<QPushButton>
class subwindow : public QWidget
{
Q_OBJECT
public:
explicit subwindow(QWidget *parent = nullptr);
private:
QPushButton *s1;
};
.cpp
subwindow::subwindow(QWidget *parent) : QWidget(parent)
{
s1 = new QPushButton("返回主窗口",this);
//创建窗口
this->setWindowTitle("子窗口");
this->resize(500,500);
connect(s1,&QPushButton::clicked,this,&subwindow::myslot);
}
3.主窗口中创建一个按钮,并创建子窗口对象,为其动态分配内存
不要忘记#include"subwindow.h"
#include"subwindow.h"
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
~MainWindow();
QPushButton *p3;//切换窗口
subwindow *obj1 = new subwindow;//子窗口对象
};
自定义信号的实现
目标:点击子窗口按钮,返回到主窗口
1.点击事件发生后,自定义的槽函数向主窗口发出信号emit + 信号();
子窗口头文件中声明发出信号的槽函数,同时为了让主窗口获取该信号,要自定义一个信号
信号可以为空
signals:
void out();
public slots:
void myslot();
.cpp文件中实现
void subwindow::myslot()
{
//发送信号
emit out();
}
2.主窗口接收信号
①定义一个实现子窗口关闭,主窗口打开的函数
mainwindow.h
void showME();
mainwindow.cpp中实现
void MainWindow::showME()
{
obj1->hide();
show();
}
②建立连接,最终实现
//接收out信号
connect(obj1,&subwindow::out,this,&MainWindow::showME);
注意:一个槽可以发出多个对象
四、QMainWindow
一、菜单栏、工具栏
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QMenuBar>
#include<QToolBar>
#include<QDebug>
#include<QPushButton>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
{
//菜单栏创建(最多有一个)
QMenuBar * bar = menuBar();
//放入窗口(空栏不显示)
setMenuBar(bar);
//创建菜单
QMenu *filemenu = bar->addMenu("文件");
QMenu *editmenu = bar->addMenu("编辑");
//创建菜单项
QAction *action1 = filemenu->addAction("新建");
//添加分隔符
filemenu->addSeparator();
filemenu->addAction("打开");
//工具栏(可以有多个)
QToolBar *tbar = new QToolBar;
addToolBar(Qt::LeftToolBarArea,tbar);
//允许左右停靠
tbar->setAllowedAreas(Qt::LeftToolBarArea | Qt::RightToolBarArea);
//设置移动(工具栏能否移动的总开关)
//tbar->setMovable(false);
//工具栏中设置内容
tbar->addAction("打开");//未共用
tbar->addSeparator();
tbar->addAction(action1);//共用:QAction *action1 = filemenu->addAction("新建");
//添加控件
QPushButton *b = new QPushButton("保存", this);
tbar->addWidget(b);
}
2.状态栏、标签控件、铆接控件(浮动窗口)、中心部件
//添加控件
QPushButton *b = new QPushButton("保存", this);
tbar->addWidget(b);
//状态栏(只有一个)
QStatusBar * stbar =statusBar();
//设置到窗口中
setStatusBar(stbar);
//存放标签控件
QLabel *qlab = new QLabel("提示",this);
stbar->addWidget(qlab);
//铆接部件(浮动窗口)
QDockWidget *dw = new QDockWidget("flow",this);
addDockWidget(Qt::TopDockWidgetArea,dw);
//设置中心部件
QTextEdit * edt = new QTextEdit(this);
setCentralWidget(edt);
五、使用添加qt资源:“:+ 前缀名 + 文件名”
步骤:
1.将图片资源复制到当前项目中: mainwindow.cpp 右键 + ”在explore中显示“,将文件复制进去
2.总项目中:右键 + “添加新文件” + qt + qt resourse file
3.res.qrc中:右键 + “open in edit” 添加资源
4.添加前缀:+ /
5.添加文件:选中并点击打开:/picture/nk.png
是文件的路径
ui->action_new->setIcon(QIcon(":/picture/nk.png"));
六、模态对话框与非模态对话框的创建
模态对话框:阻塞效果,不可以对其他窗口进行操作
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
resize(600,800);
//点击新建按钮弹出一个对话框
connect(ui->action_new,&QAction::triggered,[=](){
QDialog dia(this);
dia.resize(200,100);
//模态
dia.exec();
});
}
非模态对话框:可以对其他窗口进行操作
要点:堆区申请内存、释放内存防止泄露
QDialog *dia1 = new QDialog(this);//容易内存泄漏
//防止内存泄漏Qt::WA_DeleteOnClose
dia1->setAttribute(Qt::WA_DeleteOnClose);
dia1->resize(200,100);
dia1->show();