QT入门学习——从信号和槽到对话框,各种控件以及自定义控件
//类名首字母大写,单词和单词之间首字母大写
//函数名变量名称首字母小写,单词和单词之间首字母大写
//快捷键
//注释ctrl +/
// 运行 ctrl +r
// 编译 ctrl b
//字体缩放ctr1+ 鼠标滚轮
//查找 ctrl+f
//整行移动 ctrl+shift+↑或者,
//帮助文档F1
//自动对齐 ctrl i;
//同名之间的.h和.cpp切换 F4
//帮助文档第一种方式F1第二种左侧按钮 1
//D:\MyPrograme\QT\5.14.2\mingw73_32\bin
2.1点击创建项目后,选择项目路径到以及给项目起名称
2.2名称·不能有中文不能有空格
2.3路径·不能有中文路径
2.4默认创建有窗口类,yWidget,基类有三种选择:QWidget、QMainWindowQDialog
2.5 main函数
2.5.1 QApplication a应用程序对象,有且仅有一个
2.5.2 mywidget w;实例化窗口对象
2.5.3 w.show0调用show函数显示窗口
2.5.4 return a.exec(让应用程序对家进入消总循环机,制中,代码阻塞到当前行
#include "mywidget.h"
#include <QApplication> // 应用程序头文件
#include <QLabel>
// main程序入口 argc 命令行变量数量,argv命令行变量数组
int main(int argc, char *argv[])
{
// 应用程序对象,qt中有且只有一个
QApplication a(argc, argv);
// 窗口默认不显示,需要调用show方法
myWidget w;
w.show();
// 进入消息循环,死循环
return a.exec();
}
3按钮控件常用API
3.1 创建QPushButton*btn=new QPushButton
3.2 设置父亲setParent(this
3.3 设置文本 setText(文字")
3.4 设置位置move宽,高W
3.5 重新指定商口大小 resize
3.6 设置窗口标题 setwindowTitle
3.7 设置窗口固定大小setFixedsize
#include "mywidget.h"
#include <QLabel>
#include <QPushButton>
myWidget::myWidget(QWidget *parent)
: QWidget(parent)
{
QLabel *label = new QLabel("hello qt");
label->setParent(this);
// 创建按钮
QPushButton *btn = new QPushButton("第二个按钮",this);
btn->move(100,100);
// 充值窗口大小
resize(600,400);
setWindowTitle("第一个窗口");
}
myWidget::~myWidget()
{
}
4对像树
4.1 当创建的对象在堆区时候,如果指定的父亲是QObject派生下来的类或者QObject子类派生下来的类,可以不用管理释放的操作,将对象会放入到对象树中。
4.2 一定程度上简化了内存回收机制
信号的发送者,发送的具体信号,信号的接受者,信号的处理(槽)
信号槽的优点,松散耦合,信号发送端和接受端本身是没有关联的,通过 connect连接将两端耦合在一起
6信号和槽
6.1连接函数:connect
6.2参数
6.2.1参数1 信号的发送者
6.2.2参数2 发送的信号(函数地址)
6.2.3参数3 信号的接受者
6.2.4参数4 处理的槽函数(函数的地址)
6.3松散羯合
写到signals下
返回void
需要声明,不需要实现
可以有参数,可以重戟
返回void
需要声明,也需要实现
可以有参数,可以重载
写到public slot下或者public或者全局函数
// 老师饿了,学生请吃饭
connect(te,&Teacher::hungry,st,&Student::treat);
当自定义信号和槽出现重载
8.1 需要利用还数指针明确指向函数的地址·
8.2void(Teacher::tsignal )QString )=&Teacher::hungry;
8.3 QString转成char *
8.3.1.ToUtf80转为QByteArray
8.3.2.Data0转为Char *
8.4信号可以连接信号
8.5断开信号disconnect
void (Teacher::*teacherSignal)(QString) = &Teacher::hungry;
void (Student::*StudentSlot)(QString) = &Student::treat;
void Student::treat(QString foodName){
// QString -> char * 先转成QByteArray(.toUtf8()) 再转成Char* ()
qDebug() << "请老师吃。。。" << foodName.toUtf8().data();
}
// 用一个按钮调用下课
QPushButton *btn = new QPushButton("下课了",this);
// 重置窗口daxiao
this->resize(600,400);
connect(btn,&QPushButton::clicked,this,&Widget::classIsOver);
// 无参的信号和槽连接
void (Teacher::*teacherSignal2)(void) = &Teacher::hungry;
void (Student::*StudentSlot2)(void) = &Student::treat;
connect(te,teacherSignal2,st,StudentSlot2);
// 信号连接信号
connect(btn,&QPushButton::clicked,te,teacherSignal2);
断开信号disconnect
1、信号是可以连接信号
2、一个信号可以连接多个槽函数
3、多个信号可以连接同一个糟函数
4、信号和槽函数的参数必须类型一一对应
5、信号和槽的参数个数是不是要一致?信号的参数个数可以多余槽函数的参数个数
connect(信号的发送者,发送的信号signal信号),信号接受者,槽函数SLOT)
优点:参数直观
缺点:编译器不会检测爸数类型:
[=](){
btn->setText("aaa");
}();
int ret = []()->int{return 1000;}();
qDebug() << "ret = " << ret;
QPushButton *myBtn1 = new QPushButton(this);
QPushButton *myBtn2 = new QPushButton(this);
myBtn1->move(100,100);
int m = 10;
connect(myBtn1,&QPushButton::clicked,this,
[m]()mutable {m=100+10;qDebug()<< m;});
connect(myBtn2,&QPushButton::clicked,this,
[=](){qDebug()<<m;});
qDebug() << m;
QPushButton * btnClose = new QPushButton;
btnClose->setText("close");
btnClose->move(100,0);
btnClose->setParent(this);
connect(btnClose,&QPushButton::clicked,this,
[=](){
btnClose->setText("关闭");
emit te->hungry("娃哈哈");
// this->close();
});
#include "widget.h"
#include "ui_widget.h"
#include <QPushButton>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 窗口
QWidget *myWidget = new QWidget;
myWidget->resize(200,200);
QPushButton *btnOpen = new QPushButton("打开",this);
this->resize(600,400);
connect(btnOpen,&QPushButton::clicked,
this,[=](){
myWidget->show();
});
QPushButton *btnclose = new QPushButton("关闭",this);
btnclose->move(200,0);
connect(btnclose,&QPushButton::clicked,
this,[=](){
myWidget->close();
});
// 一个按钮控制两个窗口
QWidget *myWidget1 = new QWidget;
myWidget1->resize(300,100);
QPushButton *myBtn = new QPushButton("open",this);
myBtn->move(50,50);
connect(myBtn,&QPushButton::clicked,this,
[=](){
if(myBtn->text()=="open"){
myBtn->setText("close");
myWidget1->show();
}
else {
myBtn->setText("open");
myWidget1->close();
}
});
}
Widget::~Widget()
{
delete ui;
}
1QMainWindow
1.1菜单栏最多有一个
1.1.1 QMenuBar * bar MenuBar();
1.1.2 setMenuBar(bar)
1.1.3 QMenu * fileMenu=bar->addMenu(文件") 创建菜单
1.1.4 QAction * newAction=ileMenu->addAction(新建");创建菜单项;
1.1.5 添加分割线fileMenu->adSeparator();
1.2工具栏可以有多个
1.2.1 QToolBar * toolbar new QToolBar(this);
1.2.2 addToolBar(默认停靠区域,toolbar )Qt::LeftToolBarArea
1.2.3 设置后期停靠区域,设置浮动,设置移动
1.2.4 添加菜单项或者添加小控件
#include "mainwindow.h"
#include <QMenuBar>
#include <qtoolbar.h>
#include <QStatusBar>
#include <QLabel>
#include <QDockWidget>
#include <QTextEdit>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
// 重置窗口大小
resize(600,400);
QMenuBar *bar = menuBar();
setMenuBar(bar);
QMenu *fileMenu = bar->addMenu("文件");
QMenu *editMenu = bar->addMenu("编辑");
// 创建菜单项, 最多只能有1个
fileMenu->addAction("新建");
// 添加分割符
fileMenu->addSeparator();
QAction *openAc= fileMenu->addAction("打开");
// 工具栏 可以有多个
QToolBar * toolbar = new QToolBar(this);
addToolBar(Qt::LeftToolBarArea,toolbar);
// 只允许左右停靠
toolbar->setAllowedAreas(Qt::LeftToolBarArea | Qt::RightToolBarArea);
// 设置浮动
toolbar->setFloatable(false);
// 设置移动,总开关 toolbar->setMovable(false);
toolbar->addAction("工具");
toolbar->addAction(openAc);
// 状态栏,最多一个
QStatusBar *stBar = statusBar();
setStatusBar(stBar);
// 放标签控件
QLabel *label = new QLabel("提示信息",this);
stBar->addWidget(label);
QLabel *labelRight = new QLabel("右侧提示信息",this);
stBar->addPermanentWidget(labelRight);
// 铆接部件,浮动窗口,可以有多个
QDockWidget * dockWidget = new QDockWidget("浮动",this);
addDockWidget(Qt::BottomDockWidgetArea,dockWidget);
dockWidget->setAllowedAreas(Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea);
// 设置中心组件, 只能有一个
QTextEdit *edit = new QTextEdit(this);
setCentralWidget(edit);
}
MainWindow::~MainWindow()
{
}
模态:不可对其他窗口操作;非模态:可操作;
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDialog>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 点击新建
connect(ui->actionNew,&QAction::triggered,
[=](){
// 对话框分类,
// 模态:不可对其他窗口操作;非模态:可操作;
QDialog dlg(this);
dlg.resize(200,200);
dlg.exec();
qDebug() << "模态对话框弹出,阻塞了";
});
}
MainWindow::~MainWindow()
{
delete ui;
}
// 非模态对话框
QDialog *dlg2 = new QDialog (this);
dlg2->resize(200,200);
dlg2->show();
dlg2->setAttribute(Qt::WA_DeleteOnClose);
qDebug() << "非模态对话框弹出";
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDialog>
#include <QDebug>
#include <QMessageBox>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 点击新建
connect(ui->actionNew,&QAction::triggered,
[=](){
// 错误对话框
// QMessageBox::critical(this,"错误","一个错误的弹窗");
// 消息对话框
// 参数1父亲 参数2标题 参数3提示内容 参数4按键类型 参数5默认关联回车按键
QMessageBox::StandardButton choose = QMessageBox::question(
this,"选择","是否选择",QMessageBox::Save | QMessageBox::Cancel,
QMessageBox::Save);
if(QMessageBox::Save==choose){
qDebug() << "选择的是保存";
}else {
qDebug() << "选择的是取消";
}
});
}
MainWindow::~MainWindow()
{
delete ui;
}
QColor color = QColorDialog::getColor(QColor(255,0,0));
qDebug() << "color=" << color.red();
//文件对话框
// 参数1父亲 参数2标题 参数3默认打开路径 参数4过滤文件格式
//返回值是选取的路径
QString str = QFileDialog::getOpenFileName(
this,"打开文件","D:\\MyFiles\\myLearn\\QT","(*.txt)");
qDebug() << "filePath = " << str;
利用布局方式给窗口进行美化
选取widget进行布局,水平布局、垂直布局、栅格布局
给用户名、密码、登陆、退出按钮进行布局:
默认窗口和控件之间有9间隙,可以调整layoutLeftMargin
利用弹篝进行布局
默认框框有9像素
密码的输入
半选状态,需要进入如下的设置
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 单选按钮 男默认选中
ui->rBtnMan->setChecked(true);
// 选中女,打印
connect(ui->rBtnWoman,&QRadioButton::clicked,this,
[=](){
qDebug() << "选中了女的";
});
// 多选
connect(ui->checkBox,&QCheckBox::stateChanged,this,
[=](int state){
qDebug() << "多选框" << state;
});
// 利用listWidget写诗
// QListWidgetItem *item = new QListWidgetItem("锄禾日当午");
// // 将这一行放入控件中
// ui->listWidget->addItem(item);
// item->setTextAlignment(Qt::AlignHCenter);
// QString
QStringList list;
list << "锄禾日当午" << "汗滴禾下土"
<< "谁知盘中餐" << "粒粒皆辛苦";
ui->listWidget->addItems(list);
}
Widget::~Widget()
{
delete ui;
}
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// treeWidget树控件
// 设置水平头
ui->treeWidget->setHeaderLabels(
QStringList() << "英雄"<< "英雄介绍"); // 匿名对象
QTreeWidgetItem *itemL = new QTreeWidgetItem(QStringList() << "力量");
QTreeWidgetItem *itemM = new QTreeWidgetItem(QStringList() << "敏捷");
QTreeWidgetItem *itemZ = new QTreeWidgetItem(QStringList() << "智力");
// 加顶层节点
ui->treeWidget->addTopLevelItem(itemL);
ui->treeWidget->addTopLevelItem(itemM);
ui->treeWidget->addTopLevelItem(itemZ);
// 追加自节点
QStringList heroL1;
heroL1 << "力量超强" << "很厉害";
QTreeWidgetItem *l = new QTreeWidgetItem(heroL1);
itemL->addChild(l);
}
Widget::~Widget()
{
delete ui;
}
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// tableWidget控件
// 设置列数
ui->tableWidget->setColumnCount(3);
// 设置 表头
ui->tableWidget->setHorizontalHeaderLabels(
QStringList() << "姓名" << "性别" << "年龄");
// 设置行数
ui->tableWidget->setRowCount(4);
// 设置正文
ui->tableWidget->setItem(0,0,new QTableWidgetItem("张三"));
QStringList nameList;
nameList << "张三" << "李四" << "王五";
QList<QString> sexList;
sexList << "男" << "女" <<"男";
for (int i=0;i <3 ;i++) {
int col = 0;
// nameList[i] 越界直接就挂了。
ui->tableWidget->setItem(i,col++,new QTableWidgetItem(nameList[i]));
// sexList.at(i) 越界抛出异常
ui->tableWidget->setItem(i,col++,new QTableWidgetItem(sexList.at(i)));
//nt 转为Qstring: QString::number(i+18) i
ui->tableWidget->setItem(i,col++,new QTableWidgetItem(QString::number(i+18)));
}
}
MainWindow::~MainWindow()
{
delete ui;
}
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 栈控件的使用
//默认页面
ui->stackedWidget->setCurrentIndex(2);
// scrollArea的使用
connect(ui->btnHome,&QPushButton::clicked,
[=](){
ui->stackedWidget->setCurrentIndex(1);
});
connect(ui->btnPush,&QPushButton::clicked,
[=](){
ui->stackedWidget->setCurrentIndex(0);
});
connect(ui->btnTool,&QPushButton::clicked,
[=](){
ui->stackedWidget->setCurrentIndex(2);
});
}
Widget::~Widget()
{
delete ui;
}
// 下拉框
ui->comboBox->addItems(QStringList() << "宝马" << "奔驰" << "拖拉机");
// 点击按钮
connect(ui->selectTuo,&QPushButton::clicked,
[=](){
ui->comboBox->setCurrentIndex(2);
// ui->comboBox->setCurrentText("拖拉机");
});
// 图片
ui->lbl_img->setPixmap(QPixmap(":/sw.png"));
#include "smallwid.h"
#include "ui_smallwid.h"
SmallWid::SmallWid(QWidget *parent) :
QWidget(parent),
ui(new Ui::SmallWid)
{
ui->setupUi(this);
// QSpinBox移动,QSlider跟着移动
void(QSpinBox::* spSignal) (int) = &QSpinBox::valueChanged;
connect(ui->spinBox,spSignal,
ui->horizontalSlider,&QSlider::setValue);
// QSlider滑动,QSpinBox滑动
connect(ui->horizontalSlider, &QSlider::valueChanged,
ui->spinBox,&QSpinBox::setValue);
}
// 设置和获取数字
void SmallWid::setNum(int num)
{
ui->spinBox->setValue(num);
}
int SmallWid::getNum()
{
return ui->spinBox->value();
}
SmallWid::~SmallWid()
{
delete ui;
}
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 点击获取,获取到控件当前的值
connect(ui->btnGetNum,&QPushButton::clicked,
[=](){
int v = ui->widget->getNum();
qDebug() << "获取的值为:" << v;
});
// 设置到一半
connect(ui->btnSetHarlf,&QPushButton::clicked,
[=](){
ui->widget->setNum(50);
});
}
Widget::~Widget()
{
delete ui;
}
QT入门学习——从信号和槽到对话框,各种控件以及自定义控件
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。