带参数和不带参数信号方式:
以下比较麻烦
//处理子窗口的信号
void (SubWidget::*funSignal)()=&SubWidget::mySignal;
connect(&subWin,funSignal,this,&MainWidget::dealSub);
void (SubWidget::*testSignal)(int,QString)=&SubWidget::mySignal;
connect(&subWin,testSignal,this,&MainWidget::dealSlot);
以下简便点(但是比较容易出问题)
public slots:
void mySlot();
void changeWin();
void dealSub();
void dealSlot(int,QString);
//Qt4信号连接
//Qt4槽函数必须有slots关键字来修饰
connect(&subWin,SIGNAL(mySignal()),this,SLOT(dealSub()));
connect(&subWin,SIGNAL(mySignal(int,QString)),this,SLOT(dealSlot(int,QString)));
以上两者效果一样,但是后者SIGNAL SLOT将函数名字 ->字符串 ,不进行错误检查
Lambda表达式和信号的功能(更加简便):
QPushButton *b4=new QPushButton(this);
b4->setText("Lambda表达式");
b4->move(150,150);
int a=10,b=100;
connect(b4,&QPushButton::released,
[=]() mutable
{
a=11; //在上面加个mutable,可对变量进行改变
b4->setText("haha123");
qDebug()<<"1111111";
qDebug()<<a<<b;
}
);
// = :把外部所有局部变量,类中的所有成员以值传递方式
// this :类中所有成员以值传递方式
// & :把外部所有局部变量,引用符号
坐标系统:
move(100,100);
/*
* 对于父窗口(主窗口),坐标系统相对于屏幕
* 原点:相对于屏幕左上角
* x:往右递增
* y:往下递增
*/
QPushButton *b1=new QPushButton(this);
b1->move(100,100);
b1->setText("^_^");
b1->resize(200,100);
/*
* 子窗口,坐标系统相对于父窗口
* 原点:相对于窗口空白区域左上角(不包括边框)
* x:往右递增
* y:往下递增
*/
QPushButton *b2=new QPushButton(b1);
b2->move(10,10);
b2->setText("@_@");
坐标系统中,对于父窗口(主窗口),坐标系统相对于屏幕;对于子窗口,坐标系统相对于父窗口
菜单栏,工具栏和状态栏:
//菜单栏
QMenuBar *mBar=menuBar();
//添加菜单
QMenu *pFile=mBar->addMenu("文件");
//添加菜单项,添加动作
QAction *pNew=pFile->addAction("新建");
connect(pNew,&QAction::triggered,
[=]()
{
qDebug() << "新建被按下";
}
);
pFile->addSeparator(); //添加分割线
QAction *pOpen=pFile->addAction("打开");
//工具栏,菜单项的快捷方式
QToolBar *toolBar=addToolBar("toolBar");
//工具栏添加快捷键
toolBar->addAction(pNew);
QPushButton *b=new QPushButton(this);
b->setText("^_^");
toolBar->addWidget(b);
connect(b,&QPushButton::clicked,
[=]()
{
b->setText("123");
}
);
//状态栏
QStatusBar *sBar=statusBar();
QLabel *label=new QLabel(this);
label->setText("Normal text file");
sBar->addWidget(label);
sBar->addWidget(new QLabel("2",this)); //addWidget 从左往右添加,直接在里面动配分配空间
sBar->addPermanentWidget(new QLabel("3",this)); //addPermanentWidget 从右往左添加
核心控件和浮动窗口:
//核心控件
QTextEdit *textEdit=new QTextEdit(this);
setCentralWidget(textEdit);
//浮动窗口
QDockWidget *dock=new QDockWidget(this);
addDockWidget(Qt::RightDockWidgetArea,dock);
//给浮动窗口添加控件
QTextEdit *textEdit1=new QTextEdit(this);
dock->setWidget(textEdit1);
模态对话框和非模态对话框:
//模态对话框
QAction *p1=menu->addAction("模态对话框");
connect(p1,&QAction::triggered,
[=]()
{
QDialog dlg;
dlg.exec();
qDebug()<<"111";
}
);
在dlg.exec()中,exec要等到用户操作才能执行
//非模态对话框
QAction *p2=menu->addAction("非模态对话框");
connect(p2,&QAction::triggered,
[=]()
{
// //QDialog dlg; (1)
// dlg.show();
// qDebug()<<"222";
// QDialog *p=new QDialog(this); (2)
// p->show();
QDialog *p=new QDialog; (3)
p->setAttribute(Qt::WA_DeleteOnClose);
p->show();
}
);
(1)比较简单,要把它当做成员,才能解决一闪而过的现象
(2)动态去分配空间,但不建议,容易造成内存越来越少,没有立即释放空间
(3)立即释放空间
关于对话框,问题对话框和关于文件对话框:
//关于对话框
QAction *p3=menu->addAction("关于对话框");
connect(p3,&QAction::triggered,
[=]()
{
QMessageBox::about(this,"about","关于Qt");
}
);
//问题对话框
QAction *p4=menu->addAction("问题对话框");
connect(p4,&QAction::triggered,
[=]()
{
int ret=QMessageBox::question(this,"question","Are you OK?",
QMessageBox::Ok,
QMessageBox::Cancel);
switch(ret)
{
case QMessageBox::Ok:
qDebug() << "I am OK";
break;
case QMessageBox::Cancel:
qDebug() << "I am bad";
break;
default:
break;
}
}
);
//关于文件对话框
QAction *p5=menu->addAction("文件对话框");
connect(p5,&QAction::triggered,
[=]()
{
QString path=QFileDialog::getOpenFileName(
this,
"open",
"../",
"souce(*.cpp *.h);;Text(*.txt);;all(*.*)"
);
qDebug() << path;
}
);