gpt4 book ai didi

c++ - 硬编码快捷方式

转载 作者:太空宇宙 更新时间:2023-11-04 12:02:59 28 4
gpt4 key购买 nike

我在好几个地方问过这个问题,但我还是想不通。

我想做的是拥有一个 QKeySequence(Qt::CTRL + Qt::Key_X, Qt::CTRL + Qt::Key_C)MainWindowQTextEdit作为中央小部件。

问题是我有一个用于剪切的快捷方式 (Ctrl+X),当我按 Ctrl+X 时,Ctrl+C它不起作用。当焦点位于不同的小部件上时,快捷方式会完美运行。

我尝试覆盖 QWidget::keyPressEventQWidget::event但它是一样的。

我还有一个问题:如果我有这两个快捷键 Ctrl+XCtrl+X Ctrl+C 为什么我没有t 收到信号 activatedAmbigiously()当我按下 Ctrl+X 时?根据 Qt 文档:

When a key sequence is being typed at the keyboard, it is said to be ambiguous as long as it matches the start of more than one shortcut.

最佳答案

这可能有点胡扯,但您不能简单地在中央小部件上安装一个事件过滤器并查找您感兴趣的按键吗?

在我看来,下面的代码似乎可以按照您的描述进行操作,如果您按 CTRL+X 它会启动一个计时器,该计时器在超时时()将触发 cut() QTextEdit 上的事件(即 QMainWindowcentralWidget())。相反,如果另一个键事件带有 CTRL+CCTRL+X 标志仍处于事件状态,它将触发 close()

主窗口.h

#ifndef MYMAINWINDOW_H
#define MYMAINWINDOW_H

#include <QMainWindow>
#include "ui_mainwindow.h"
#include <QTimer>

class MainWindow: public QMainWindow, private Ui::MainWindow
{
Q_OBJECT

public:
MainWindow(QWidget *parent = 0 );
virtual bool eventFilter(QObject *obj, QEvent *event);

public slots:
void passOnEvent();

private:
QTimer *timer;
bool xactive;

};

#endif

主窗口.cc

#include "mainwindow.h"

#include <QMouseEvent>
#include <QKeyEvent>

MainWindow::MainWindow(QWidget *parent ) : QMainWindow(parent), timer (new QTimer), xactive(false)
{
setupUi(this);
centralWidget()->installEventFilter(this);
}

bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
if( obj != centralWidget() ) {
return QObject::eventFilter(obj, event);
} else if (event->type() == QEvent::KeyPress ) {
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
if( keyEvent->key() == Qt::Key_X && keyEvent->modifiers() == Qt::ControlModifier ) {
timer->start(250);
connect(timer,SIGNAL(timeout()),this,SLOT(passOnEvent()));
xactive = true;
return true;
} else if( xactive && keyEvent->key() == Qt::Key_C && keyEvent->modifiers() == Qt::ControlModifier ) {
this->close();
return true;
} else {
return QObject::eventFilter(obj, event);
}
} else {
// standard event processing
return QObject::eventFilter(obj, event);
}
}

void MainWindow::passOnEvent()
{
xactive = false;
timer->stop();
static_cast<QTextEdit*>(centralWidget())->cut();
}

虽然这段代码对我有用,但其中可能有些东西会干扰您正在做的其他事情。此外,我不会解决您对 QKeySequenceactivatedAmbigiously() 提出的任何问题。

如果这有帮助,请告诉我。

关于c++ - 硬编码快捷方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13363332/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com