
Qt 56样例:
MainWindowh:
#ifndef MAINWINDOW_H#define MAINWINDOW_H
#include <QObject>
#include <QMainWindow>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget parent = 0);
~MainWindow();
private:
void initialAction();
void initialMenuBar();
void initialToolBar();
void initialStatusBar();
void open();
QAction openAction;
};
#endif // MAINWINDOW_HMainWindowcpp:#include <QAction>
#include <QMenuBar>
#include <QMessageBox>
#include <QStatusBar>
#include <QToolBar>
#include "MainWindowh"
MainWindow::MainWindow(QWidget parent) :
QMainWindow(parent)
{
setWindowTitle(tr("Main Window"));
initialAction();
initialMenuBar();
initialToolBar();
initialStatusBar();
}
MainWindow::~MainWindow()
{
}
void MainWindow::initialAction()
{
openAction = new QAction(QIcon(":/images/doc-open"), QObject::tr("&Open"), this);
openAction->setShortcuts(QKeySequence::Open);
connect(openAction, &QAction::triggered, this, &MainWindow::open);
}
void MainWindow::initialMenuBar()
{
QMenu file = menuBar()->addMenu(QObject::tr("&File"));
file->addAction(openAction);
}
void MainWindow::initialToolBar()
{
QToolBar toolBar = addToolBar(QObject::tr("&File"));
toolBar->addAction(openAction);
}
void MainWindow::initialStatusBar()
{
statusBar();
openAction->setStatusTip(QObject::tr("Open an existing file"));
}
void MainWindow::open()
{
QMessageBox::information(this, tr("Information"), tr("Open"));
}
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 控制,setFocusPolicy(Qt::StrongFocus);Qt::TabFocus通过Tab键获得焦点Qt::ClickFocus通过被单击获得焦点Qt::StrongFocus可通过上面两种方式获得焦点Qt::NoFocus不能通过上两种方式获得焦点(默认值),setFocus仍可使其获得焦点 keypress和keyrelease 首先,我们要是Widget获得焦点,一般设置focusPolicy。 然后要对按键进行响应,我们只需要直接重载:keyPressEventkeyReleaseEvent 注意:对我们不处理的事件,要调用父类的相应事件处理函数。 如果widget当前没有焦点,考虑到事件转发:如果其子widget有焦点,那么该widget未处理的键盘事件将被转发过来。 有时输入焦点不在任何窗口中。这种情况发生在所有程序都是最小化的时候。这时,Windows将继续向活动窗口发送键盘消息,但是这些消息与发送给非最小化的活动窗口的键盘消息有不同的形式。 QKeyEvent 在windows下,与键盘事件有关的有8个消息:对产生可显示字符的按键组合,Windows不仅给程序发送按键消息,而且还发送字符消息 有些键不产生字符,这些键包括shift键、功能键、光标移动键和特殊字符键如Insert和Delete。对于这些键,Windows只产生按键消息。 这些消息在Qt中只体现在QKeyEvent中。对字符,可通过 QKeyEvent::text() 获得其他键,QKeyEvent::key() 获得一个键值实际程序:public: void keyPressEvent(QKeyEvent event);在相应键盘事件之前需要 用一个widget 进行设置 LabelComment->setFocusPolicy(Qt::StrongFocus);void CameraShow::keyPressEvent(QKeyEvent event) { if(event->key()==Qt::Key_Q) { Pause_flag ^= 1; }}
你的意思是子窗口中的一个按钮被点击了,父窗口上的一个slot函数响应这个点击吧?
很简单的:
1)在子窗口里面增加一个signal,在父窗口里面增加一个响应slot用于接收这个信号。
2)子窗口的按钮slot函数中emit这个signal。
3)在父窗口中把子窗口的这个signal连到自己的响应slot。
// 子窗口
class ChildWindow : public QWidget
{
Q_OBJECT
public:
ChildWindow(QWidget p = 0)
:QWidget(p)
{
QVBoxLayout l = new QVBoxLayout(this);
QPushButton btn = new QPushButton("btn", this);
l->addWidget(btn);
connect(btn, SIGNAL(clicked()), SLOT(ClickedBtn());
}
signals:
// 这个信号是发给父窗口的。
void ChildWindowEvent();
protected slots:
// 点击子窗口中按钮的slot
void ClickedBtn()
{
// 触发子窗口的信号给父窗口接收。
emit ChildWindowEvent();
}
}
// 父窗口
class ParentWindow : public QWidget
{
Q_OBJECT
public:
ParentWindow(QWidget p = 0)
:QWidget(p)
{
QVBoxLayout l = new QVBoxLayout(this);
w = new ChildWindow(this);
l->addWidget(w);
// 把子窗口的信号连接到父窗口来。
connect(w, SIGNAL(ChildWindowEvent()), SLOT(ChildWindowEventSlot());
}
protected:
ChildWindow w;
protected slots:
// 父窗口用于接收子窗口信号的slot。
void ChildWindowEventSlot()
{
//子窗口的按钮被点击了。
}
}
Qt 实现进程间窗口嵌套
环境:Qt 591_msvc2015_64bit,Window 10
为了实现在qt程序中打开Window上其他应用程序,并将其嵌入到qt程序中。
方法:获取外部程序的窗口句柄,调用
[static]QWindow QWindow::fromWinId(WIdid)
函数创建QWindow,然后调用
[static]QWidget QWidget::createWindowContainer(QWindow window,QWidget parent = Q_NULLPTR,Qt::WindowFlagsflags = Qt::WindowFlags())
创建一个QWidget即可。
关键之处在于如何获取窗口句柄。
我们都知道Windows编程中,可以通过FindWindow系列的函数获取HWND类型的窗口句柄(需要include windowsh头文件),HWND类型和Qt中的WId类型可以转换,所以通过FindWindow我们可以找到想要嵌入的窗口,不论是子窗口还是主窗口,即使是整个桌面也未尝不可。
下面贴一下效果图:
原程序:
这是嵌入之后的Qt程序:
可以看到,在这里标题栏和边框都消失了。很有意思的方法,好奇Qt是如何做到这种进程间的嵌套,这篇只是简单介绍,待我研究透彻再来给大家分享。
如果不需要嵌套窗口的话,Qt也提供了其他的方法,不需要如此复杂。像QDesktopServices类,可以打开本地应用程序(打开文件或网页时,自动选择默认的应用程序)。
一开始的目的,是想将office窗口显示到qt程序里面,采用的是activexQt模块,但activex的开发需要一定时间的积累,微软的东西比较难用,加上activex只能打开微软自家的东西(有待验证),而且如果以后不仅仅是显示office呢?所以干脆直接嵌套进程窗口,一劳永逸。
以上就是关于QT新人不会用信号与槽 求大神给段用信号与槽实现如下代码 选项是个菜单按钮想单击子选项显示相应窗口全部的内容,包括:QT新人不会用信号与槽 求大神给段用信号与槽实现如下代码 选项是个菜单按钮想单击子选项显示相应窗口、【QT】如何让QWidget接收键盘事件、在QT我想通过按下子窗口的一个按钮的按钮然后可以调用父窗口中的一个槽函数应该怎么做,在线等等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)