一、信号槽的connect写法
第一种:
connect(ui->colorBtn,SIGNAL(clicked()),this,SLOT(colorBtn_clicked()));
这种是将字符串传入,编译器不会报错,若没有触发。查问题很困难
建议使用第二种:
connect(ui->treeWidget,&QTreeWidget::currentItemChanged,this,&MainWindow::currentTreeItemChanged);
基本上会触发,而且currentItemChanged 函数是有参数的,不用写上参数了。用这种方式,编译器会检查,推荐。
2、macos下开发,生成的 note.app 文件,右键->显示包内容,还有一个文件夹系统。mac会把所有相关文件全部打包成一个app。
所以访问一些配置文件,如xml,需要把配置文件放到note.app里面的目录下,这样就可以直接访问
考虑使用编译前拷贝的方式,直接在pro文件增加一些命令实现,而不是手动拷贝。而且是否拷贝到note.app下需要好好考虑
说实话mac到处透露着反人类的设计,可能是win用习惯了。主要优点就是续航和触摸板确实给力。其他方面同价位win碾压。
二、信号槽SIGNAL和SLOT
其实这就是两个宏定义:
#define SIGNAL(arg) #arg
#define SLOT(arg) #arg
#代表将arg转化为string字符串,所以传入的就是字符串.
1、单#的作用是把参数变成字符串;
2、##的作用是连接组合参数名字;
如下面这个例子:
#include <iostream.h>
using namespace std;
#define TEST0(arg) cout << arg << endl
#define TEST1(arg) cout << #arg << endl
#define TEST2(arg) cout << i##arg << endl
#define TEST3(arg) cout << arg##t << endl
#define TEST4(arg) cout << i##arg##t << endl
int main()
{
int iTest = 10;
TEST0(iTest);
TEST1(iTest);
TEST2(Test);
TEST3(iTes);
TEST4(Tes);
return 0;
}
输出为:
10
iTest
10
10
10
三、子窗体向父窗体传值
当父窗体,点击某个按钮,弹出一个子窗体时,此时子窗体用户操作完成后,需要给主窗体传值
一种常用的做法是通过connect信号槽
代码如下:
//主窗体在合适时间写connect语句,一般是在弹出子窗体的时候,如下:
//MainWindow.cpp
void MainWindow::onAddnewBtn_clicked()
{
if(this->childWindow==NULL)
{
childWindow=new ChildWindow;
connect(childWindow,&ChildWindow::sendData,this,&MainWindow::onReceiveData);
}
childWindow->show();
}
//实现槽函数,响应函数
void MainWindow::onReceiveData(QString data)
{
qDebug()<<data;
}
//MainWindow.h 很简单,需要定义下槽函数
public slots: //slots可写可不写
void onReceiveData(QString data);
//ChildWindow.h
//这里是关键,需要定义一个信号函数,但只需要定义,不需要cpp中实现
signals: //必须写上signals,否则connect函数中会报找不到信号
void sendData(QString); //无需写形参名,只需要类型即可
//ChildWindow.cpp
//在适当的时间点,举例如okBtn点击时,触发信号函数即可
void ChildWindow::okBtn_clicked()
{
//将lineEdit中的值传入信号函数,这里实际上是调用了信号函数
//由于上方的connect,最终会在onReceiveData中收到data的值
sendData(ui->lineEdit->text());
}