首页  > 世界杯冠军奖金

QT入门学习——从信号和槽到对话框,各种控件以及自定义控件

引出QT入门学习——从信号和槽到对话框,各种控件以及自定义控件

qt的使用代码语言:java复制//类名首字母大写,单词和单词之间首字母大写

//函数名变量名称首字母小写,单词和单词之间首字母大写

//快捷键

//注释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创建第一个Qt程序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(让应用程序对家进入消总循环机,制中,代码阻塞到当前行

代码语言:java复制#include "mywidget.h"

#include // 应用程序头文件

#include

// 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

代码语言:java复制#include "mywidget.h"

#include

#include

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 一定程度上简化了内存回收机制

信号signal槽slot信号的发送者,发送的具体信号,信号的接受者,信号的处理(槽)

信号槽的优点,松散耦合,信号发送端和接受端本身是没有关联的,通过 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松散羯合

自定义信号和槽1.自定义信号写到signals下

返回void

需要声明,不需要实现

可以有参数,可以重戟

2.自定义槽返回void

需要声明,也需要实现

可以有参数,可以重载

写到public slot下或者public或者全局函数

3.建立连接代码语言:java复制// 老师饿了,学生请吃饭

connect(te,&Teacher::hungry,st,&Student::treat);4.进行触发自定义信号重载当自定义信号和槽出现重载

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

带参数的代码语言:java复制 void (Teacher::*teacherSignal)(QString) = &Teacher::hungry;

void (Student::*StudentSlot)(QString) = &Student::treat;代码语言:java复制void Student::treat(QString foodName){

// QString -> char * 先转成QByteArray(.toUtf8()) 再转成Char* ()

qDebug() << "请老师吃。。。" << foodName.toUtf8().data();

}按钮触发代码语言:java复制 // 用一个按钮调用下课

QPushButton *btn = new QPushButton("下课了",this);

// 重置窗口daxiao

this->resize(600,400);

connect(btn,&QPushButton::clicked,this,&Widget::classIsOver);信号触发信号代码语言:java复制 // 无参的信号和槽连接

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)

优点:参数直观

缺点:编译器不会检测爸数类型:

lambda表达式代码语言:java复制 [=](){

btn->setText("aaa");

}();返回值代码语言:java复制 int ret = []()->int{return 1000;}();

qDebug() << "ret = " << ret;mutable修饰代码语言:java复制 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()<

qDebug() << m;案例代码语言:java复制 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();

});打开关闭窗口案例代码语言:java复制#include "widget.h"

#include "ui_widget.h"

#include

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;

}qt的菜单栏工具栏菜单栏,工具栏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 添加菜单项或者添加小控件

状态栏,浮动窗口代码语言:java复制#include "mainwindow.h"

#include

#include

#include

#include

#include

#include

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()

{

}属性设计ui编辑控件添加图片对话框模态方式模态:不可对其他窗口操作;非模态:可操作;

代码语言:java复制#include "mainwindow.h"

#include "ui_mainwindow.h"

#include

#include

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;

}非模态方式代码语言:java复制 // 非模态对话框

QDialog *dlg2 = new QDialog (this);

dlg2->resize(200,200);

dlg2->show();

dlg2->setAttribute(Qt::WA_DeleteOnClose);

qDebug() << "非模态对话框弹出";系统对话框消息框代码语言:java复制#include "mainwindow.h"

#include "ui_mainwindow.h"

#include

#include

#include

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;

}颜色框代码语言:java复制 QColor color = QColorDialog::getColor(QColor(255,0,0));

qDebug() << "color=" << color.red();文件框代码语言:java复制 //文件对话框

// 参数1父亲 参数2标题 参数3默认打开路径 参数4过滤文件格式

//返回值是选取的路径

QString str = QFileDialog::getOpenFileName(

this,"打开文件","D:\\MyFiles\\myLearn\\QT","(*.txt)");

qDebug() << "filePath = " << str;界面布局利用布局方式给窗口进行美化

选取widget进行布局,水平布局、垂直布局、栅格布局

给用户名、密码、登陆、退出按钮进行布局:

默认窗口和控件之间有9间隙,可以调整layoutLeftMargin

利用弹篝进行布局

默认框框有9像素

输入框密码的输入

tool按钮单选框多选框半选状态,需要进入如下的设置

listWidget代码语言:java复制#include "widget.h"

#include "ui_widget.h"

#include

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;

}QTreeWidget代码语言:java复制#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;

}QTableWidget代码语言:java复制#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 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;

}其他控件stackedWidget代码语言:java复制#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;

}combox下拉框代码语言:java复制 // 下拉框

ui->comboBox->addItems(QStringList() << "宝马" << "奔驰" << "拖拉机");

// 点击按钮

connect(ui->selectTuo,&QPushButton::clicked,

[=](){

ui->comboBox->setCurrentIndex(2);

// ui->comboBox->setCurrentText("拖拉机");

});label标签代码语言:java复制 // 图片

ui->lbl_img->setPixmap(QPixmap(":/sw.png"));自定义控件自定义一个控件自定义控件定义方法函数代码语言:java复制#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;

}widget窗口调用函数代码语言:java复制#include "widget.h"

#include "ui_widget.h"

#include

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入门学习——从信号和槽到对话框,各种控件以及自定义控件