这几天的需求是做一个锁屏,对于一个Qt工作者来说,可能就是一会儿的事,但是我也是刚开始接触,所以花的时间多了些,现在来说下思路。
锁屏嘛,就是当输入密码后点击锁屏后就锁屏,然后屏蔽任务管理器(暂未实现),输入密码后判断和之前的密码对不对,对的话就锁屏,错的话就不管。
首先,我把所有的控件全部都写在一个weight中,为什么了?因为两个页面的跳转还不会,所以就先全部写进来,然后hide()隐藏。
键盘的输入调用的是KeyBoardProc
LRESULT CALLBACK KeyBoardProc(int code, WPARAM wParam, LPARAM lParam)
{
if (code == HC_ACTION)
{
PKBDLLHOOKSTRUCT p;
switch (wParam)
{
case WM_KEYDOWN:
case WM_SYSKEYDOWN:
case WM_KEYUP:
case WM_SYSKEYUP:
p = (PKBDLLHOOKSTRUCT)lParam;
if (GetAsyncKeyState(VK_CONTROL) && GetAsyncKeyState(VK_MENU) && GetAsyncKeyState(VK_DELETE))
{
while (1)//死循环,因为我们不知道windows何时会弹出,所以给死循环
{
f = FindWindow(NULL, _T("Windows 任务管理器"));
GetWindowThreadProcessId(f, &ID1);
pid1 = OpenProcess(PROCESS_ALL_ACCESS, FALSE, ID1);
if (TerminateProcess(pid1, NULL))
{
qtimer2 = 0;
return 0;//屏蔽之后退出
}
}
}
if (((LOWORD(lParam) & VK_CONTROL) != 0) && (((LOWORD(lParam) & VK_MENU) != 0)) && (HIWORD(lParam) == VK_DELETE) || GetAsyncKeyState(VK_CONTROL)<0 || (p->vkCode == VK_ESCAPE) && ((p->flags & LLKHF_ALTDOWN) != 0) || (p->vkCode == VK_F4) && ((p->flags & LLKHF_ALTDOWN) != 0) || (p->vkCode == VK_TAB) && ((p->flags & LLKHF_ALTDOWN) != 0) || (p->vkCode == VK_LWIN) || (p->vkCode == VK_RWIN) || ((p->flags & LLKHF_ALTDOWN) != 0) || ((p->flags & LLKHF_ALTDOWN) != 0)) //left win or right win
//if (WM_SYSKEYDOWN == pMsg->message // WM_SYSKEYDOWN 表示ALT键按下 && VK_F4 == pMsg->wParam)
{
//qDebug() << "按键";
return 1;
}
break;
}
}
return ::CallNextHookEx(g_hKey, code, wParam, lParam);
}
void LOCKQ::SetHook()
{
g_hKey = SetWindowsHookEx(WH_KEYBOARD_LL, KeyBoardProc, GetModuleHandle(NULL), 0);
}
void LOCKQ::UnSetHook()
{
UnhookWindowsHookEx(g_hKey);
}
lineedit获取文本直接用的是
str1=u1.password1->text();
如果两次输入密码一样,则将隐藏的frame显示出来,然后将现在的frame hide()掉,如果两次输入的密码不一样,则将当前的文本设置成红色,透明背景无边框。
u1.password1->setStyleSheet("background-image:url(:/QLock/Resources/bk/null.png);color:red;background:transparent;border-width:0;border-style:outset;");
u1.password2->setStyleSheet("background-image:url(:/QLock/Resources/bk/null.png);color:red;background:transparent;border-width:0;border-style:outset;");
但是当重新输入密码的时候,怎么让lineedit中的字体变成白色呢?用timeout()不行,因为这不是实时刷新的,而是当重新点击这个lineedit时,才会将字体变回原来的颜色,后来查阅Qt5的文档, 采用的是textEdited,
connect(u1.password1, SIGNAL(textEdited()), this, SLOT(slot_setcolor()));
但是这样的写法又没法达到效果,查阅了无数的资料,但是一无所获,最后采用的是Qt4的写法,
connect(u1.password2, &QLineEdit::textEdited, this, &LOCKQ::slot_setcolor);
虽然不明白为什么,但是效果起码是实现了,群友给的说法是
“Qt5一旦槽函数有重载,这写法只能用无参数的”
设置焦点在lineedit且响应空格的方法是
u1.startlock->setShortcut(QKeySequence::InsertParagraphSeparator);
u1.startlock->setShortcut(Qt::Key_Enter);
u1.startlock->setShortcut(Qt::Key_Return);
总的来说,Qt就是在信号与槽之间的调用。
以上。