Qt使用IE控件和屏蔽页面右键菜单

要在Qt中使用IE控件,需要用到 QAxWidget,在工程文件中需要添加axcontainer

QT       += core gui axcontainer

在设计器中添加QAxWidget


右键点击控件,设置ActiveX控件为Microsoft Web Browser



通过页面加载后,查找到Internet Explorer_Server窗口后,直接屏蔽鼠标右键点击消息

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include <Windows.h>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    navigate("http://www.baidu.com");
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::navigate(const QString &url)
{
    ui->axWidget->dynamicCall("Navigate(cosnt QString &)", url);
}

void MainWindow::showHwndName(HWND hwnd)
{
    if (hwnd == 0)
        return;

    TCHAR className[MAX_PATH];
    GetClassName(hwnd, className, MAX_PATH);
    qDebug() << QString::fromWCharArray(className);
}

static WNDPROC preWndProc;
LONG shieldMenuWndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
    if(msg==WM_RBUTTONDOWN) //屏蔽鼠标右键
        return 0;

    return CallWindowProc((WNDPROC)preWndProc,hwnd,msg,wParam,lParam);
}

void MainWindow::shieldIEContextMenu(QAxWidget *widget)
{
    HWND widgetHwnd = (HWND)widget->winId();
    if (widgetHwnd > 0)
    {
        HWND ieServerHwnd = GetTopWindow(widgetHwnd); //QAxHostWidgetWindow
        ieServerHwnd = GetWindow(ieServerHwnd, GW_CHILD); //Shell Embedding
        ieServerHwnd = GetWindow(ieServerHwnd, GW_CHILD); //Shell DocObject View
        ieServerHwnd = GetWindow(ieServerHwnd, GW_CHILD); //Internet Explorer_Server
        if (ieServerHwnd > 0)
        {
            if (GetWindowLong(ieServerHwnd, GWL_WNDPROC) != (LONG)&shieldMenuWndProc)
            {
                qDebug() << "shield Menu";
                preWndProc=(WNDPROC)::SetWindowLong(ieServerHwnd,GWL_WNDPROC,(LONG)shieldMenuWndProc);
            }
            else
            {
                qDebug() << "ignore";
            }
        }
    }
}

void MainWindow::on_axWidget_NavigateComplete(const QString &URL)
{
    shieldIEContextMenu(ui->axWidget);
}


以下是在QTableView控件中设置右键菜单的完整代码: ```cpp #include <QApplication> #include <QTableView> #include <QStandardItemModel> #include <QMenu> #include <QAction> #include <QPoint> int main(int argc, char *argv[]) { QApplication a(argc, argv); // 创建一个QTableView控件和一个QStandardItemModel模型 QTableView tableView; QStandardItemModel model; // 设置模型的行数和列数 model.setRowCount(3); model.setColumnCount(2); // 设置表头 model.setHorizontalHeaderLabels({"姓名", "年龄"}); // 设置数据 model.setItem(0, 0, new QStandardItem("张三")); model.setItem(0, 1, new QStandardItem("18")); model.setItem(1, 0, new QStandardItem("李四")); model.setItem(1, 1, new QStandardItem("20")); model.setItem(2, 0, new QStandardItem("王五")); model.setItem(2, 1, new QStandardItem("22")); // 将模型设置给QTableView控件 tableView.setModel(&model); // 创建一个右键菜单 QMenu menu(&tableView); QAction *addAction = new QAction("添加", &menu); QAction *deleteAction = new QAction("删除", &menu); // 添加菜单项 menu.addAction(addAction); menu.addAction(deleteAction); // 连接菜单项的槽函数 QObject::connect(addAction, &QAction::triggered, [&]() { // 在模型中添加一行数据 int rowCount = model.rowCount(); model.insertRow(rowCount); // 设置新添加的一行的数据 model.setItem(rowCount, 0, new QStandardItem("新用户")); model.setItem(rowCount, 1, new QStandardItem("0")); }); QObject::connect(deleteAction, &QAction::triggered, [&]() { // 获取选中的行 QModelIndexList selectedRows = tableView.selectionModel()->selectedIndexes(); // 删除选中的行 for (const QModelIndex &index : selectedRows) { model.removeRow(index.row()); } }); // 在QTableView控件中设置右键菜单 tableView.setContextMenuPolicy(Qt::CustomContextMenu); QObject::connect(&tableView, &QTableView::customContextMenuRequested, [&](const QPoint &pos) { menu.exec(tableView.mapToGlobal(pos)); }); tableView.show(); return a.exec(); } ``` 在这个例子中,我们使用QTableView控件和QStandardItemModel模型来展示数据。我们通过设置模型的行数和列数,以及设置表头和数据来填充模型。然后,我们将模型设置给QTableView控件,以便在GUI中显示数据。 我们创建了一个QMenu对象来作为右键菜单,并添加了两个菜单项(添加和删除)。我们连接了菜单项的槽函数来实现对模型的添加和删除操作。 我们在QTableView控件中设置了右键菜单,并连接了customContextMenuRequested信号来在右键单击时显示菜单。我们使用mapToGlobal函数将鼠标单击位置的坐标转换为全局坐标,以便在正确的位置显示菜单。 最后,我们显示QTableView控件并运行应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值