一、QT图形界面
-
QT坐标轴:
X:横轴
Y:纵轴
image.png -
QWidget、QDialog、QMainWindow的区别
QWidget:窗口为空,什么内容都没有
QMainWindow:含有menu bar,status bar,tools bar等
QDialog:对话框 -
设置编码方式linux除外
编码.png
-
QMainWinodw
布局 image.png菜单栏--Menu Bar
工具栏--ToolBars
浮动部件--Duck Widgets
主窗口--Central Widget
状态栏--Status Bar
注意:窗口设计的代码需要放在构造函数中ui->setupUi(this);代码后面,不然会挂掉。
Not TODO.png
二、对话框
- 分类:模态对话框,非模态对话框,半模态对话框
//Moldal Dialog
QDialog * Qdlg=new QDialog(&w);//w:parent window
Qdlg->resize(200,300);
Qdlg->setWindowTitle(QStringLiteral("Modal Dialog"));
Qdlg->exec();
//Modeless Dialog
QDialog * Qdlg=new QDialog(&w);//w:parent window
Qdlg->resize(200,300);
Qdlg->setWindowTitle(QStringLiteral("Modeless Dialog"));
Qdlg->show();
//setModal(true/false)实现模态和非模态的转化
Qdlg->setModal(false);
Qdlg->show();
三、信号与槽
概念:在Qt中使用信号和槽机制来完成对象之间的协同操作(信号和槽都是函数)
信号:当某个信号对其客户或所有者发生的内部状态发生改动,信号被一个对象发射。只有定义过这个信号的类及其派生类能够发射这个信号。
当一个信号被发射时,和其相关联的槽将被即时执行,就象一个正常的函数调用相同。信号-槽机制完全独立于所有GUI事件循环。只有当所有的槽返回以后发射函数(emit)才返回。如果存在多个槽和某个信号相关联,那么,当这个信号被发射时,这些槽将会一个接一个地执行,不过他们执行的顺序将会是随机的、不确定的,我们不能人为地指定哪个先执行、哪个后执行
槽:槽是普通的C++成员函数,能被正常调用,他们唯一的特别性就是非常多信号能和其相关联。当和其关联的信号被发射时,这个槽就会被调用。槽能有参数,但槽的参数不能有缺省值。
public slots:在这个区内声明的槽意味着所有对象都可将信号和之相连接。这对于组件编程非常有用,你能创建彼此互不了解的对象,将他们的信号和槽进行连接以便信息能够正确的传递。
protected slots:在这个区内声明的槽意味着当前类及其子类能将信号和之相连接。这适用于那些槽,他们是类实现的一部分,不过其界面接口却面向外部。
private slots:在这个区内声明的槽意味着只有类自己能将信号和之相连接。这适用于联系非常紧密的类。
槽也能够声明为虚函数,这也是非常有用的。
关联:通过调用QObject对象的connect函数来将某个对象的信号和另外一个对象的槽函数相关联,这样当发射者发射信号时,接收者的槽函数将被调用
*函数定义:bool QObject::connect ( const QObject * sender, const char * signal, const QObject * receiver, const char * member ) [static]
1.自动关联
image.png-
按需要选择要生成的槽函数:
image.png
- 系统自动生成槽函数,一般以on为开头
//此次自动生成的槽函数
private slots:
void on_pushButton_clicked();//Qt-defined slot
//槽函数用户自己实现函数体
void MainWindow::on_pushButton_clicked(){}
2.利用connect()关联
注意:信号函数与槽函数的参数必须一致,且都是自定义函数。
信号函数:只需要定义,不需要实现,没有实体。
槽函数:响应函数,需要实现功能。
//parameter : sender signal receiver slot
connect()
- 系统信号和用户定义槽
//ui头文件里
signals:
void pushButton2Signal();//user-defined signal
private slots:
void pushButton2Slot(bool checked);//usr-defined slot
//在ui构造函数中实现connect关联
//parameter : sender signal receiver slot
connect(ui->pushButton_2,SIGNAL(clicked(bool)),this,SLOT(pushButton2Slot(bool)));
- 用户信号和槽
//ui头文件
signals:
void pushButton2Signal();//user-defined signal
private slots:
void pushButtonMySlot();//user-defined slot
//在某函数体内发射信号
emit pushButton2Signal();//emit user-defined signal
////在ui构造函数中实现connect关联
connect(this,SIGNAL(pushButton2Signal()),this,SLOT(pushButtonMySlot()));
3.断开关联:
当信号和槽没有必要继续保持关联时,我们能使用disconnect函数来断开连接
函数定义:bool QObject::disconnect ( const QObject * sender, const char * signal, const Object * receiver, const char * member ) [static]有三种情况必须使用disconnect()函数:
(1):断开和某个对象相关联的所有对象。这似乎有点不可理解,事实上,当我们在某个对象中定义了一个或多个信号,这些信号和另外若干个对象中的槽相关联,如果我们要切断这些关联的话,就能利用这个方法,非常之简洁。
disconnect( myObject, 0, 0, 0 ) 或 myObject->disconnect()
(2):断开和某个特定信号的所有关联。
disconnect( myObject, SIGNAL(mySignal()), 0, 0 ) 或 myObject->disconnect( SIGNAL(mySignal()) )
(3):断开两个对象之间的关联。
disconnect( myObject, 0, myReceiver, 0 ) 或 myObject->disconnect( myReceiver )
网友评论