QT学习笔记(6月)
1. Qt qojbect_cast的使用
函数原型:
T qobject_cast ( QObject * object )
本方法返回object向下的转型T,如果转型不成功则返回0,如果传入的object本身就是0则返回0。
在使用时有两个限制:
- T类型必须继承自QObject。
- 在声明时必须有Q_OBJECT宏。
官方例子如下:
QObject *obj = new QTimer; // QTimer inherits QObject
QTimer *timer = qobject_cast<QTimer *>(obj);
// timer == (QObject *)obj
QAbstractButton *button = qobject_cast<QAbstractButton *>(obj);
// button == 0 <br>
使用场景:
当某一个Object emit一个signal的时候,它就是一个sender,系统会记录下当前是谁emit出这个signal的,
所以你在对应的slot里就可以通过 sender()得到当前是谁invoke了你的slot。
有可能多个 Object的signal会连接到同一个signal(例如多个Button可能会connect到一个slot函数onClick()),
因此这是就 需要判断到底是哪个Object emit了这个signal,根据sender的不同来进行不同的处理.
在槽函数中:
QObject * obj = sender(); //返回发出信号的对象,用QObject类型接收
QPushButton *button_tmp = qobject_cast<QPushButton *>(obj); //向下转型为按钮类型
//...对此按钮的其他操作
2. 自定义日历控件
在网上看到一个实现自定义的日历控件(当然还有其他更好的方案)。主要是,该自定义控件还可以设置时间,效果如图所示:
刚好项目中需要设置日期与时间,Qt自带的QDateTimeEdit不可恭维。为此选择自定义该控件,继承QDateTimeEdit。
具体见附件DefDateTimeEdit。
使用方法如下:
m_defDateTimeEdit = new DefDateTimeEdit(ui->tab);
m_defDateTimeEdit->setMinimumWidth(175);
3. 按钮绑定键盘快捷键
pushButton_login->setShortcut(Qt::Key_Enter);//将字母区回车键与登录按钮绑定在一起
4. Qt弹窗不能指定父类
在一个项目需要实现点击一个按钮实现弹出另外一个对话框。由于在新建对象的时候,手贱指定了父类指针this.结果使得新建对象的窗体嵌在了已有的窗体中。如图:
m_password = new ChangePassword(this);
m_password->show();
最终取消指定的父类this。直接
m_password = new ChangePassword;
m_password->show();
原型为:
ChangePassword(QWidget *parent = 0);
其中QWidget *parent = 0 表示ChangePassword控件不是任何控件的子控件。因此对window来说他是一个单独的控件,可以实现弹出窗体。
其中这篇博文讲述了继承QWidget的对象,什么时候是一个窗体,什么时候是一个控件。完全取决于parent 是什么。
漫谈QWidget及其派生类(一)