
要析构的,要验证按钮会不会自动的析构,(即在QPushButton类里面的析构函数添加qDebug打印出一些东西就知道调用了),但是QPushButton的这个按钮类也不是自己写的(析构函数也就不知道在哪里),而是系统里就有的。所以这里为了实现验证,这里将会自己构建一个按钮类,并且自己写这个按钮类的析构函数,在析构函数里面添加打印的东西,这样当调用的时候就会显性的知道系统调用了析构函数。
自定义的控件就是继承自Qt的自定义的一个类,常用的是继承自QWidget类。在Qt可视化编程中,可视化编程有两种方式:
使用常规的方法,创建一个该类的对象,然后加入到布局管理器中,show一下就可以看到效果了;
Qt Designer提供的控件拖拽创建界面,可是自定义的控件显然不在系统自带的控件列表中,所以我们需要看看自定义的控件是继承自哪个类,例如:QWidget,然后拖出一个QWidget,然后右键点击,选择提升为,这样就可以实现拖拽创建页面了。
想要在Qt里使用全局热键,最好的办法是重载QApplication里的winEventFilter函数。这个函数是用来响应Windows系统信息的。其函数原型为virtual bool winEventFilter(MSG msg, long result)。当msg指针中的message(MSG结构中的一个元素)为WM_HOTKEY类型时,就是用户激发了热键。整个过程和在VC的消息响应机制很类似,只不过换成了Qt而已。
而如果我们想要添加自己的全局热键,只需要使用RegisterHotKey函数即可。其函数原型为:
BOOL RegisterHotKey( HWND hWnd, int id, UINT fsModifiers, UINT vk );
HWND类型是Windows中的窗口句柄类型,在Qt中,QWidget及其子类均可使用winId()函数得到。
第二个参数,是一个原子 *** 作类型,用ATOM GlobalAddAtom(LPCTSTR lpString )函数得到。这也是一个Win32API,根据一个string参数可以得到一个唯一的值。使用完之后,必须使用GlobalDeleteAtom函数删除掉整个ATOM。其函数原型为ATOM GlobalDeleteAtom( ATOM nAtom )。
后面两个参数,一个是修饰键,一个是普通按键。例如,假设我们想注册Ctrl+F4这个热键组合,则fsModifiers就是MOD_CONTROL,而vk就是VK_F4。
如果注册成功,就返回true,否则,返回false。
注意,使用完之后,要使用UnregisterHotKey函数注销,否则你可能再也无法注册这个热键了!除非重启。其函数原型为:BOOL UnregisterHotKey(HWND hWnd, int id )。
ok,热键注册就完成了。当按下热键后,我们就会在QApplication里的winEventFilter函数中收到一个msg。这个msg,前面也说过,我们需要知道它的一个元素message是不是WM_HOTKEY。如果是,就证明我们收到了Windows系统的热键信息。在MSG结构中,我们可能还需要理解的元素有两个,分别是wParam和lParam。wParam是注册热键时所用的id,也就是ATOM(原子)。而lParam就是我们的热键了。其实际上是一个32位的类型,前面16位代表普通按键,后16位代表的是修饰键。
1、用户按下Tab键(或者Shift键+Tab键)(或者有时是Enter键)。
2、用户点击一个窗口部件。
3、用户按下一个键盘快捷键。
4、用户使用鼠标滚轮。
5、用户移动焦点到一个窗口,并且应用程序必须决定窗口中的哪个窗口部件应该得到焦点。
首先,你得确保你有Qt framework的基础知识。
其次,如果你的主界面显示有几种决策要取决于你的需求:
你的显示是列表,还是表格,这里决定着你的布局是如何布局的。
另一个则是使用外部的布局还是将整个显示作为一个整体。
先获取某文件中的文件信息,可以通过QDir,获取对应的entryList,设置好对应的ext的过滤器即可。
这么说,如果你是使用外部布局,你每一个由QPixmap/QImage导入,再用一个QLabel来显示,列表还是表格则可以用QBoxLayout或是GridLayout。 在Win32中,由于每一个Widget都有窗体句柄, 你可以通过对应的win32API 获取对应的子窗体。
而使用整体布局,列表或是表格则可以用QListView/QTableView,重写对应的model即可,难度比较大,但是扩展性比较好,由于每个QListView/QTableView都is-a QWidget,因此都具有唯一的窗体句柄(当然不考虑view port widget),同时内部是存在类似layout的布局管理,当内部某个model改变的时候,该窗体一般会局部刷新等等。
简而言之,如果你需要很快入手,建议使用第一种。
由QDir => QPixmap/QImage => QLabel => QBoxLayout/QGridLayout
有问题HI~
如果需要帮忙,价钱好谈= =~ 缺钱呐~
呃,最后句话当我没说…
您好,Qt键盘事件属于Qt事件系统,所以事件系统中所有规则对按键事件都有效。下面关注点在按键特有的部分:
focus
一个拥有焦点(focus)的QWidget才可以接受键盘事件。有输入焦点的窗口是活动窗口或活动窗口子窗口或子子窗口等。
焦点移动的方式有以下几种:
按下Tab或Shift+Tab
注意:文本编译器(一般需要插入Tab),或者WebView(需要Tab来移动超链接焦点) 等
Qt中,需要输入Tab的地方可以用 Ctrl+Tab 或 Ctrl+Shift+Tab 替代。
点击一个QWidget
建议:只对接受文本输入的Widget启用该功能
按下键盘的快捷键
QLabel::setBuddy(), QGroupBox,以及 QTabBar 支持
使用鼠标滚轮
用户移动焦点
程序将决定被设置focus的Widget的哪一个子Widget获得焦点
注意:如果一个 Widget 已经 grabKeyboard,所有键盘事件将发送到该Widget而不是获得焦点的Widget
focusPolicy
一个QWidget获得焦点的方式受 focusPolicy 控制
Qt::TabFocus
通过Tab键获得焦点
Qt::ClickFocus
通过被单击获得焦点
Qt::StrongFocus
可通过上面两种方式获得焦点
Qt::NoFocus
不能通过上两种方式获得焦点(默认值),setFocus仍可使其获得焦点
keypress和keyrelease
首先,我们要是Widget获得焦点,一般设置focusPolicy。
然后要对按键进行响应,我们只需要直接重载:
keyPressEvent
keyReleaseEvent
注意:
对我们不处理的事件,要调用父类的相应事件处理函数。
如果widget当前没有焦点,考虑到事件转发:如果其子widget有焦点,那么该widget未处理的键盘事件将被转发过来。
有时输入焦点不在任何窗口中。这种情况发生在所有程序都是最小化的时候。这时,Windows将继续向活动窗口发送键盘消息,但是这些消息与发送给非最小化的活动窗口的键盘消息有不同的形式。
QKeyEvent
在windows下,与键盘事件有关的有8个消息:
对产生可显示字符的按键组合,Windows不仅给程序发送按键消息,而且还发送字符消息
有些键不产生字符,这些键包括shift键、功能键、光标移动键和特殊字符键如Insert和Delete。对于这些键,Windows只产生按键消息。
这些消息在Qt中只体现在QKeyEvent中。
对字符,可通过 QKeyEvent::text() 获得
其他键,QKeyEvent::key() 获得一个键值
event函数
由于 Tab 键被用来切换焦点,这使得它与众不同。
这是qwidgetcpp的event函数中的代码片段:
case QEvent::KeyPress:
{
QKeyEvent k = (QKeyEvent )event;
bool res = false;
if (!(k->modifiers() & (Qt::ControlModifier | Qt::AltModifier)))
{ //### Add MetaModifier
if (k->key() == Qt::Key_Backtab || (k->key() == Qt::Key_Tab && (k->modifiers() & Qt::ShiftModifier)))
res = focusNextPrevChild(false);
else if (k->key() == Qt::Key_Tab)
res = focusNextPrevChild(true);
if (res)
break;
}
keyPressEvent(k);
}
如果我们需要处理Tab键,需要重载 event 函数。
以上就是关于qt自定义控件要写析构吗全部的内容,包括:qt自定义控件要写析构吗、Qt 全局热键要怎么做、qt下的qwidget框口怎么设置才能不吃焦点等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)