短学期实训(2)

PART 1

本例主要帮助理解QT中信号与槽机制,实现从主窗口切换到子窗口,再从子窗口切换回主窗口的过程。
在这里插入图片描述
在这里插入图片描述

功能1:实现退出按钮

buttonExit = new QPushButton(this);//使用构造函数指定父对象
//buttonExit->setParent(this);
buttonExit->move(20, 50);
buttonExit->setText(“退出按钮”);
//connect函数创建连接
connect(buttonExit, &QPushButton::clicked, this, &signalAndSlot::close);
//将按钮的点击信号与本类的默认系统函数close连接,是的点击后退出

功能2:从主窗口切换到子窗口
先在现有项目中添加 Qt Gui Class,命名为myWidget,创建子窗口

//建立一个窗口用于窗口切换
buttonSwitch = new QPushButton(this);
buttonSwitch->move(20, 80);
buttonSwitch->setText(“切换到子窗口”);
//mWidget.show();
mWidget.setWindowTitle(“子窗口”);
connect(buttonSwitch, &QPushButton::clicked, this, &signalAndSlot::switchToTouch);

在主窗口中创建按钮buttonSwitch,再添加成员函数switchToTouch,用于隐藏主窗口显示子窗口

功能3(较复杂):从子窗口切换回主窗口
因为mWidget已是signalAndSlot中的数据成员,若单是从主窗口切换到子窗口当然容易,this可对成员任意操控嘛。但现在子窗口想要反过来控制主窗口,只能使用信号与槽机制,主窗口的槽函数接受到来自子窗口的信号,从而显示自己隐藏子窗口,其实还是操作主体实现还是主窗口

public:
signalAndSlot(QWidget *parent = Q_NULLPTR);
myWidget mWidget;

在子窗口向主窗口发送信号时,使用了二级信号
myWidget.h:

public slots:
void sendSlot();
public: signals://注意冒号写法
void mySignal();
void mySignal(int,QString);
//mySignal()函数只需要函数声明,不需要定义,定义了则会报错

cpp

扫描二维码关注公众号,回复: 10321980 查看本文章

void myWidget::sendSlot()
{
emit mySignal();//发送另一个信号
emit mySignal(200,“我是子窗口请点击”);
}

此处使用了信号函数mySignal的重载,后面将提到

buttonSwitch = new QPushButton(this);
buttonSwitch->move(50, 50);
buttonSwitch->setText(“切换到主窗口”);
connect(buttonSwitch, &QPushButton::clicked, this, &myWidget::sendSlot);

在子窗口中创建切换按钮用于切换回主窗口

接下来为主窗口接受信号并调用槽函数作出反应,其中涉及到前文中mySignal函数的重载处理

// QT4方法:
//利用函数指针实现,同一名称的信号函数的重载
void (myWidget:: *functionSignal1)() = &myWidget::mySignal;
connect(&mWidget, functionSignal1, this, &signalAndSlot::switchToMain);
void (myWidget:: *functionSignal2)(int,QString) = &myWidget::mySignal;
connect(&mWidget, functionSignal2, this, &signalAndSlot::dealSlot);

// QT5方法:
//利用函数重载实现
connect(&mWidget,SIGNAL(mySignal()), this, SLOT(switchToMain()));//QT4的写法,采用宏
connect(&mWidget, SIGNAL(mySignal(int, QString)), this, SLOT(dealSlot(int, QString)));
//QT5可支持函数重载,信号函数可带参数; QT4解决此问题采用函数指针方式

之后又介绍了Lambda表达式,安全又不麻烦,鼓励后期做项目时使用Lambda表达式

//关于Lambda表达式
//为了简化开发过程中编写connect函数的工作,使用c++11中支持的Lambda表达式
buttonLambda = new QPushButton(this);
buttonLambda->move(20, 150);
buttonLambda->setText(“Lambda”);
connect(buttonLambda, &QPushButton::clicked,
[=](bool isCheck) //bool参数默认值是false
{
qDebug() << “这里是Lambda表达式打印的内容”;
qDebug() << isCheck;
});
//[]表示的是参数传递列表,有三种取值:取值=,表示将外部的所有局部变量、类中的成员变量,以值拷贝的方式传入表达式,
//取值&,表示将……以引用传递的方式传入;取值this,类中所有成员以值传递方式传入
//()希望传出的参数列表

在进行Lambda表达式测试时,建立了数组,熟悉了[]中值传递、引用传递等方法
但在处理数组时发生了数组越界问题,造成很大麻烦
后续Bug:E2512 功能测试宏的参数必须是简单标识符
以及一些编辑并继续的问题,后续警告和错误非常多,也明白了数据处理中内存空间存放问题的重要性

PART 2

介绍了坐标和窗口的一些知识
在这里插入图片描述
一些非常简单的:
move函数控制窗口初始时显示的位置、resize函数控制窗口大小,以及按钮在new创建时就连接父对象,之后的move则根据父对象来决定按钮位置

b2 = new QPushButton(“小按钮”, b1); //改变父对象为b1

PART 3

该部分介绍使用VS+QT创建一个基础的notepad记事本,不过今天仅仅实现了按钮部件还未添加功能。也在此中认知到了要充分利用现有学习工具,根据所需功能查找对应函数进行调用,不可能记得住所有的函数方法,只有在使用时去查找再调用。该阶段好好利用qtcreator中的帮助 查找函数
在这里插入图片描述
这里添加了菜单栏 工具栏 主工作区 状态栏 浮动窗口栏
由于时间关系,部分控件大小和位置还没进行改善,仅实现了添加控件

//菜单栏
mBar = new QMenuBar(this);
mBar->resize(1000, 50);
//添加菜单项
QMenu* pMenuFile = mBar->addMenu(“文件”);
QMenu* pMenuEdit = mBar->addMenu(“编辑”);
QMenu* pMenuFormat = mBar->addMenu(“格式”);
QMenu* pMenuView = mBar->addMenu(“查看”);
QMenu* pMenuHelp = mBar->addMenu(“帮助”);
//添加菜单子项目
QAction* pActionNew = pMenuFile->addAction(“新建”);
//连接新建Action和将来要用到的槽函数
connect(pActionNew,&QAction::triggered,

{
qDebug() << “新建按钮被按下”;
});
QAction* pActionOpen = pMenuFile->addAction(“打开”);
QAction* pActionSave = pMenuFile->addAction(“保存”);
QAction* pActionSaveAs = pMenuFile->addAction(“另存为”);
//加入分割线
pMenuFile->addSeparator();
QAction* pActionPageSet = pMenuFile->addAction(“页面设置”);
QAction* pActionPrint = pMenuFile->addAction(“打印”);
//加入分割线
pMenuFile->addSeparator();
QAction* pActionExit = pMenuFile->addAction(“退出”);
connect(pActionExit, &QAction::triggered,
&
{
this->close();
});
QAction* pActionRevocate = pMenuEdit->addAction(“撤销”);
//加入分割线
pMenuEdit->addSeparator();
QAction* pActionShear = pMenuEdit->addAction(“剪切”);
QAction* pActionCopy = pMenuEdit->addAction(“复制”);
QAction* pActionStick = pMenuEdit->addAction(“粘贴”);
QAction* pActionDelete = pMenuEdit->addAction(“删除”);
//加入分割线
pMenuEdit->addSeparator();
QAction* pActionBing = pMenuEdit->addAction(“使用Bing搜索”);
QAction* pActionFind = pMenuEdit->addAction(“查找”);
QAction* pActionFindNext = pMenuEdit->addAction(“查找下一个”);
QAction* pActionReplace = pMenuEdit->addAction(“替换”);
QAction* pActionTurn = pMenuEdit->addAction(“转到”);
//加入分割线
pMenuEdit->addSeparator();
QAction* pActionSelectAll = pMenuEdit->addAction(“全选”);
QAction* pActionDate = pMenuEdit->addAction(“时间/日期”);
//添加工具栏
tBar = new QToolBar(this);
tBar->resize(1000, 20);
tBar->move(20, 20);
//为工具栏添加工具按钮
buttonNewFile = new QPushButton(this);
tBar->addAction(pActionNew);
buttonNewFile->setText(“New”);
tBar->addWidget(buttonNewFile);
//主工作区
//主工作区的核心部件为TextEdit
textEdit = new QTextEdit(this);
textEdit->move(5, 50);
textEdit->resize(990, 550);
//状态栏
statusBar = new QStatusBar(this);
statusBar->move(0, 580);
statusBar->resize(980, 30);
//给状态栏添加标签
normalLabel = new QLabel(this);
normalLabel->setText(“normal Text Edit Mod”);
statusBar->addWidget(normalLabel, 0);
unnormalLabel = new QLabel(this);
unnormalLabel->setText(“Unnormal Text Edit Mod”);
statusBar->addWidget(unnormalLabel);
//浮动窗口栏
dock = new QDockWidget(this);
lineEdit = new QLineEdit(this);
dock->setWidget(lineEdit);
dock->move(400, 500);

在这里插入图片描述

发布了2 篇原创文章 · 获赞 0 · 访问量 12

猜你喜欢

转载自blog.csdn.net/weixin_43754153/article/details/99888310
今日推荐