QMainWindow菜单栏和工具栏
菜单栏,工具栏,状态栏,中心部件,铆接部件(浮动窗口)
菜单栏
//创建菜单栏QMenuBar *bar = menuBar();//指定父组件this->setMenuBar(bar);this->resize(600,400);this->setFixedSize(600,400); //固定窗口大小//往菜单栏里添加菜单//往 菜单里添加菜单项QMenu *file1 = bar->addMenu("文件");QMenu *file2 = bar->addMenu("编辑");bar->addMenu("构建");bar->addMenu("调试");file1->addAction("新建");file1->addSeparator();file1->addAction("打开");file2->addAction("复制");file2->addSeparator();file2->addAction("粘贴");
工具栏
//创建工具栏QToolBar *tbar = new QToolBar(this);//将工具栏放入窗口 默认靠左停靠this->addToolBar(Qt::LeftToolBarArea,tbar);//后期设置,只允许左右停靠tbar->setAllowedAreas(Qt::LeftToolBarArea | Qt::RightToolBarArea);//设置不允许浮动tbar->setFloatable(false);//往工具栏里增加工具项tbar->addAction("欢迎");//实例化一个按钮QPushButton *btn = new QPushButton("编辑",this);//将按钮放入工具栏tbar->addWidget(btn);
状态栏
//创建状态栏 最多只有一个QStatusBar *sbar = statusBar();//将状态栏放入窗口this->setStatusBar(sbar);//实力化一个标签QLabel *lab = new QLabel("编译输出",this);//将标签放入状态栏//sabr->addWidget(lab) 默认从左边显示sbar->addPermanentWidget(lab);//默认从右边显示
铆接部件(浮动窗口)
//创建浮动窗口 可以有多个QDockWidget *dock = new QDockWidget("报错",this);//将浮动窗口放入窗口中this->addDockWidget(Qt::BottomDockWidgetArea,dock);//只允许左右停靠dock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);//创建一个中心部件 只能有一个QTextEdit *edit = new QTextEdit(this);//将文本编辑器放入窗口中this->setCentralWidget(edit);
中心部件
//创建一个中心部件 只能有一个QTextEdit *edit = new QTextEdit(this);//将文本编辑器放入窗口中this->setCentralWidget(edit);
UI界面文件
UI界面文件在Forms文件夹下
UI界面可以通过UI指针访问到UI界面上的所有组件
资源文件的添加
确保项目兼容性,能够使得自己的代码在其他电脑能够正常运行,或者发布软件时也能正常运行。
步骤
将需要的资源放入项目中。
给项目增加一个资源文件,存放资源
编译
登陆界面升级
#include "login.h"
#include "ui_login.h"login::login(QWidget *parent): QWidget(parent), ui(new Ui::login)
{ui->setupUi(this);QMovie *mv = new QMovie(":/pictrue/qq2.gif");ui->login_label->setMovie(mv);mv->start();ui->login_label->setScaledContents(true); //使图片自适应标签ui->user_label->setPixmap(QPixmap(":/pictrue/qq.png"));ui->user_label->setScaledContents(true); //使图片自适应标签ui->password_label->setPixmap(QPixmap(":/pictrue/passwd.jpg"));ui->password_label->setScaledContents(true); //使图片自适应标签ui->password_Edit->setEchoMode(QLineEdit::Password);}login::~login()
{delete ui;
}
信号与槽
qt核心机制:对象树,信号与槽,事件机制
信号与槽是qt的核心机制之一,可以实现多个组件之间的连续(通信)
信号:信号函数,定义在类体的sginals权限下的函数,信号是一个不完整的函数,只要声明,不要实现。
槽:槽函数,定义在类体的slots权限下的函数,槽函数是一个完整的函数,既要声明又要实现。(槽函数可以当作普通函数使用)
任意一个组件都有系统提供的信号和槽
带有信号与槽的类体定义
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private:Ui::Widget *ui;signals://表示在该权限下,都是信号函数(只能定义函数)void my_signal();public slots://表示该权限下,都是槽函数(只能定义函数)void my_slot();};
#endif // WIDGET_H
信号与槽的连接方式
方式一:基于UI界面上的连接,将UI界面上系统提供的信号与槽进行连接。(该链接方式不需要写信号函数,槽函数,连接函数)
方式二:基于UI界面上的连接,在组件上右击,转到槽,选中要发射的信号,在系统提供的槽函数框架中,书写逻辑代码(该链接方式不需要写信号函数,连接函数)
void Widget::on_close_clicked()
{qDebug() << "hello" << endl;static int num = 0;if(num%3 == 1){ui->btn->setStyleSheet("background-color:red");}else if(num%3 == 2){ui->btn->setStyleSheet("background-color:green");}else if(num%3 == 0){ui->btn->setStyleSheet("background-color:blue");}num++;
}
方式三:手动连接信号和槽,基于qt4版本的连接,该链接是不友好的链接(该链接方式需要写连接函数,connect函数在QOject类中)
[static] QMetaObject::Connection //函数的返回值 静态成员函数QObject::connect( //函数名const QObject *sender, //组件的指针 信号的发送者const char *signal, //信号,由于信号是个函数,需要用函数指针,而不能用char *进行接受const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection)
练习
将day1做的登录界面升级优化【资源文件的添加】
在登录界面的登录取消按钮进行以下设置:
使用手动连接,将登录框中的取消按钮使用第2种方式的连接到自定义的槽函数中,在自定义的槽函数中调用关闭函数
将登录按钮使用qt4版本的连接到自定义的槽函数中,在槽函数中判断ui界面上输入的账号是否为"admin",密码是否为"123456",如果账号密码匹配成功,则输出“登录成功”,并关闭该界面,如果匹配失败,则输出登录失败,并将密码框中的内容清空
头文件
#ifndef LOGIN_H
#define LOGIN_H#include <QWidget>
#include <QMovie>
#include <QPushButton>
#include <QDebug>
#include <QString>QT_BEGIN_NAMESPACE
namespace Ui { class login; }
QT_END_NAMESPACEclass login : public QWidget
{Q_OBJECTpublic:login(QWidget *parent = nullptr);~login();public slots:void my_slot();void my_slot1();private:Ui::login *ui;QPushButton *cancel_Button;QPushButton *login_Button;
};
#endif // LOGIN_H
源文件
#include "login.h"
#include "ui_login.h"login::login(QWidget *parent): QWidget(parent), ui(new Ui::login), cancel_Button(new QPushButton("取消",this)) //实例化cancel_Button空间, login_Button(new QPushButton("登录",this)) //实例化login_Button空间
{ui->setupUi(this);QMovie *mv = new QMovie(":/pictrue/qq2.gif");ui->login_label->setMovie(mv);mv->start();ui->login_label->setScaledContents(true); //使图片自适应标签ui->user_label->setPixmap(QPixmap(":/pictrue/qq.png"));ui->user_label->setScaledContents(true); //使图片自适应标签ui->password_label->setPixmap(QPixmap(":/pictrue/passwd.jpg"));ui->password_label->setScaledContents(true); //使图片自适应标签ui->password_Edit->setEchoMode(QLineEdit::Password);login_Button->move(ui->password_label->x(),ui->password_label->y()+ui->password_label->height()+30);login_Button->resize(60,30);cancel_Button->move(login_Button->x()+login_Button->width()+30,login_Button->y());cancel_Button->resize(login_Button->size());connect(cancel_Button,SIGNAL(clicked()),this,SLOT(my_slot()));connect(login_Button,SIGNAL(clicked()),this,SLOT(my_slot1()));}login::~login()
{delete ui;
}void login::my_slot()
{this->close();
}void login::my_slot1()
{QString user,password;user = ui->user_Edit->text();password = ui->password_Edit->text();if(user == "admin" & password == "12345678"){qDebug() << "登陆成功" <<endl;this->close();}else{qDebug() << "登陆失败" <<endl;ui->user_Edit->clear();ui->password_Edit->clear();}
}