Qt工具栏中自定义QAction按钮的实战指南

Qt工具栏中添加按钮QAction Qt工具栏添加Action按钮 QAction QToolBar 阅读详情

1. 从零开始:为什么你需要自定义QAction按钮?

如果你刚开始接触Qt开发,可能会觉得Qt Designer里拖拖拽拽就能做出一个带按钮的工具栏,为什么还要大费周章地去“自定义”一个QAction呢?这个问题问得好。我刚开始用Qt的时候也是这么想的,直到我接手了一个需要复杂交互的桌面项目。那个项目里,工具栏上的按钮远不止“新建”、“打开”、“保存”那么简单。我们需要根据用户权限动态显示或隐藏某些功能按钮,需要在按钮上显示实时状态(比如一个“同步中”的旋转图标),甚至需要把按钮和复杂的业务逻辑,比如一个自定义的数据处理流程,紧密绑定在一起。

这时候,仅仅依靠Qt Designer里默认的拖拽操作就显得力不从心了。你会发现,QAction 这个看似简单的类,其实是Qt中连接用户界面(UI)和业务逻辑(Business Logic)的一座核心桥梁。它不仅仅是一个按钮的视觉表象,更是一个封装了动作(Action)的实体。这个“动作”包含了这个操作是什么(文本、图标)、怎么触发(快捷键、信号)、触发后做什么(连接到槽函数),以及它在当前状态下是否可用(enable/disable)。理解并掌握如何自定义QAction,意味着你从“界面组装工”向“功能架构师”迈进了一大步。

想象一下这个场景:你正在开发一个文本编辑器。除了基础的编辑功能,你还想添加一个“语法检查”按钮。这个按钮在用户没有打开文档时应该是灰色的(不可用);在文档打开后变为可用;点击后,它需要启动一个后台检查线程,同时按钮的图标要变成一个动态的加载动画,提示用户等待;检查完成后,图标恢复,并在界面上高亮显示错误。这种动态的、状态驱动的交互,就是自定义QAction大显身手的地方。它让你能精细地控制每一个用户操作的每一个细节。

所以,这篇指南的目的,就是带你超越简单的拖拽,深入Qt工具栏的核心,手把手教你如何从创建、配置到功能绑定,完全掌控你自己的QAction按钮。无论你是想实现一个炫酷的动画图标,还是构建一个响应上下文菜单的智能工具栏,从这里开始,你都能找到清晰的路径。

2. 两种创建方式:Designer拖拽 vs. 纯代码手写

创建QAction主要有两种流派,就像做菜有用预制菜和从买菜开始一样,各有各的适用场景和乐趣。我两种方式在项目里都用得很多,下面给你详细拆解一下。

2.1 可视化创建:Qt Designer快速上手

对于大多数标准功能,比如文件操作(新建、打开、保存)、编辑操作(复制、粘贴、剪切),使用Qt Designer进行可视化创建是最快、最直观的方法。原始文章里提到的6个步骤,就是这个流程的骨架。我来给它填充上血肉,让你知道每一步的“为什么”和“可能遇到的坑”。

第一步:在Action Editor里“新建Action”。你会在Qt Designer界面的右下角找到一个叫“Action Editor”的窗口。这里是你管理所有QAction的指挥部。右键点击空白处,选择“新建”,就会弹出一个对话框。这里有个小技巧:对象名称(ObjectName)最好遵循清晰的命名规范,比如 actionNew_File, actionSave_Project。这在你后续写代码连接信号槽时,能让你一眼就认出它是谁。

第二步:精心配置Action的属性。这是赋予Action灵魂的一步。除了文本(Text)和工具提示(ToolTip),我强烈建议你总是设置一个图标(Icon)。人都是视觉动物,一个醒目的图标比一行小字更能快速传达功能。Qt支持多种图片格式,你可以通过“选择资源…”来添加。这里我踩过一个坑:早期我直接用绝对路径链接本地图片,在另一台电脑上编译时就找不到图片了。所以,**务必使用Qt的资源系统(.qrc文件)**来管理你的图标。具体操作是,先在项目里创建一个.qrc文件,把图片添加进去,然后在Designer里选择这个资源路径下的图标。这样,图标就被编译进了可执行文件,分发时再也不用担心图片丢失了。

第三步和第四步:创建工具栏并拖入Action。在Designer主窗口空白处右键,选择“添加工具栏”,一个空白的工具栏就会出现在菜单栏下方。然后,你就可以直接从Action Editor里,把刚才创建好的Action拖到这个工具栏上。你会发现,拖上去之后,它自动就变成了一个带图标的按钮。这个过程非常“所见即所得”。

第五步:微调与美化。你可以拖动工具栏的边缘调整其大小,也可以右键点击工具栏,选择“允许移动”,这样用户运行时可以拖动工具栏停靠在窗口的不同位置(上、下、左、右)。对于Action本身,你还可以在属性编辑器里设置更多细节,比如是否只显示图标(iconOnly)、是否显示文本(textOnly),或者两者都显示。

第六步:连接信号与槽。在Designer里,切换到“信号/槽编辑”模式(或直接右键Action,选择“转到槽…”),选择 triggered() 信号,并连接到主窗口的一个槽函数上。Designer会自动在头文件里为你声明这个槽函数,并在.cpp文件里生成一个空的实现。你只需要去.cpp文件里填充具体的业务逻辑代码就行了。原始文章里的代码示例就是这一步的成果。

这种方式优点是快,适合UI和逻辑都比较固定的场景。但它的灵活性相对受限,比如你想动态改变一个按钮的图标,或者在运行时根据某些条件创建新的按钮,就需要用到纯代码的方式了。

2.2 代码创建:动态与灵活的终极武器

当你需要动态生成界面,或者Action的行为需要高度定制时,纯代码创建就是唯一的选择。这种方式让你对QAction有百分之百的控制权。

让我们用代码重写一个“新建文件”的Action,并把它添加到工具栏上。

// 在MainWindow的构造函数中(或某个初始化函数里)
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    // 1. 创建主窗口的UI(如果不用Designer .ui文件,这一步可能是其他布局代码)
    // 2. 创建工具栏
    QToolBar *mainToolBar = new QToolBar("主工具栏", this);
    this->addToolBar(mainToolBar); // 将工具栏添加到主窗口

    // 3. 创建QAction
    QAction *actionNew = new QAction(this); // 指定父对象,内存自动管理
    // 3.1 设置属性
    actionNew->setText(tr("新建")); // tr()用于国际化翻译
    actionNew->setToolTip(tr("创建一个新文件"));
    actionNew->setIcon(QIcon(":/icons/new_file.png")); // 从资源文件加载图标
    actionNew->setShortcut(QKeySequence::New); // 设置标准快捷键Ctrl+N

    // 4. 将Action添加到工具栏
    mainToolBar->addAction(actionNew);

    // 5. 连接信号与槽
    connect(actionNew, &QAction::triggered, this, &MainWindow::handleNewFile);
}

// 槽函数实现
void MainWindow::handleNewFile()
{
    qDebug() << "执行新建文件操作";
    // 这里实现你的具体业务逻辑,比如弹出对话框、清空视图等
}

通过代码创建,你可以轻松实现动态效果。例如,根据网络状态切换一个“同步”按钮的图标:

// 假设有一个网络状态改变的信号
connect(networkManager, &NetworkManager::statusChanged, this, [this, actionSync](bool isOnline) {
    if (isOnline) {
        actionSync->setIcon(QIcon(":/icons/sync_green.png"));
        actionSync->setToolTip(tr("点击开始同步"));
        actionSync->setEnabled(true);
    } else {
        actionSync->setIcon(QIcon(":/icons/sync_gray.png"));
        actionSync->setToolTip(tr("网络未连接,无法同步"));
        actionSync->setEnabled(false);
    }
});

这种能力是可视化编辑难以企及的。选择哪种方式? 我的经验是:对于静态的、标准的UI元素,用Designer提高效率;对于需要动态改变、或者逻辑复杂的部分,用代码实现。在实际项目中,两者常常是混合使用的。

3. 超越基础:高级定制与状态管理

掌握了创建方法,我们来看看如何把QAction玩出花来。一个专业的应用,其工具栏按钮应该是智能的、有状态的、符合用户预期的。

3.1 富文本与复杂图标

默认情况下,工具栏按钮的文本是简单的单行标签。但有时我们需要更多信息。虽然QAction本身不支持直接在按钮上显示富文本,但我们可以通过继承QWidgetAction并放置一个QLabel来实现类似效果,不过这通常有些重。更常见的需求是图标状态。

一个典型的例子是“播放/暂停”按钮。我们可以使用QAction的setIcon()方法在运行时动态切换图标。

// 在类定义中
private:
    bool m_isPlaying = false;
    QAction *m_playPauseAction;

// 在初始化中
m_playPauseAction = new QAction(QIcon(":/icons/play.png"), tr("播放"), this);
connect(m_playPauseAction, &QAction::triggered, this, &MainWindow::togglePlayPause);

// 槽函数
void MainWindow::togglePlayPause()
{
    m_isPlaying = !m_isPlaying;
    if (m_isPlaying) {
        m_playPauseAction->setIcon(QIcon(":/icons/pause.png"));
        m_playPauseAction->setText(tr("暂停"));
        // 开始播放...
    } else {
        m_playPauseAction->setIcon(QIcon(":/icons/play.png"));
        m_playPauseAction->setText(tr("播放"));
        // 暂停播放...
    }
}

3.2 数据关联与上下文感知

QAction可以携带数据,这是实现上下文感知功能的关键。setData()和data()方法允许你为一个Action关联一个QVariant类型的值。

假设我们有一个工具栏,上面有一组按钮用来切换不同的视图模式(卡片视图、列表视图、详情视图)。我们可以这样做:

// 创建一组互斥的Action(类似Radio Button)
QActionGroup *viewModeGroup = new QActionGroup(this);
viewModeGroup->setExclusive(true); // 设置互斥

QAction *actionCardView = new QAction("卡片视图", this);
actionCardView->setCheckable(true); // 设置为可勾选
actionCardView->setData(static_cast<int>(ViewMode::Card)); // 关联枚举值
viewModeGroup->addAction(actionCardView);
mainToolBar->addAction(actionCardView);

QAction *actionListView = new QAction("列表视图", this);
actionListView->setCheckable(true);
actionListView->setData(static_cast<int>(ViewMode::List));
viewModeGroup->addAction(actionListView);
mainToolBar->addAction(actionListView);

// 连接整个Action组的信号
connect(viewModeGroup, &QActionGroup::triggered, this, [this](QAction *action) {
    ViewMode mode = static_cast<ViewMode>(action->data().toInt());
    switchToViewMode(mode); // 切换到对应的视图模式
});

这样,当用户点击不同的视图按钮时,我们不仅能收到触发信号,还能立刻知道具体是切换到哪个模式,代码非常清晰。可勾选(Checkable) 的Action在表示状态开关时特别有用,比如“加粗”、“斜体”这类文本格式按钮,它们本身就是一个二态开关。

3.3 动态可见性与权限控制

在实际企业级应用中,工具栏按钮的可见性和可用性经常需要根据用户角色或当前任务状态来改变。使用setVisible(false)和setEnabled(false)可以轻松实现。

setEnabled(false)会让按钮变灰,不可点击,但依然占据位置,提示用户此功能存在但当前不可用。setVisible(false)则直接隐藏按钮,适用于完全不需要此功能的场景。

我通常会在一个叫updateUIState()的函数里集中处理这些逻辑:

void MainWindow::updateUIState(UserRole role, DocumentStatus docStatus) {
    // 只有管理员能看到“导出日志”按钮
    actionExportLog->setVisible(role == UserRole::Administrator);

    // 只有文档已修改,“保存”按钮才可用
    actionSave->setEnabled(docStatus == DocumentStatus::Modified);

    // 没有选中任何内容时,“复制”和“剪切”按钮变灰
    bool hasSelection = textEditor->textCursor().hasSelection();
    actionCopy->setEnabled(hasSelection);
    actionCut->setEnabled(hasSelection);
}

然后在用户登录、文档内容改变、选择区域变化等时机调用这个函数,确保UI状态始终正确。

4. 实战演练:构建一个智能“格式刷”按钮

光说不练假把式。我们一起来实现一个稍微复杂但非常实用的例子:一个类似Word的“格式刷”按钮。这个按钮的行为是:点击一次(拾取格式),鼠标指针改变,然后用户可以去其他文本上应用格式;或者双击它(锁定格式),可以连续多次应用格式。

这个例子会综合运用我们前面讲到的多种技术:动态图标、状态切换、数据关联和鼠标事件处理。

第一步:设计Action和状态变量 我们在主窗口类里添加以下成员:

private:
    QAction *m_formatPainterAction;
    bool m_isFormatPainterActive = false;
    bool m_isFormatPainterLocked = false;
    QTextCharFormat m_copiedFormat; // 用于存储拾取的文本格式

第二步:创建和初始化Action 在构造函数或初始化函数中:

m_formatPainterAction = new QAction(QIcon(":/icons/format_painter.png"), tr("格式刷"), this);
m_formatPainterAction->setCheckable(true); // 让它可以被按下/弹起
mainToolBar->addAction(m_formatPainterAction);

// 连接信号,注意我们连接的是triggered,但checkable的action状态变化会更复杂
connect(m_formatPainterAction, &QAction::triggered, this, &MainWindow::onFormatPainterTriggered);

第三步:实现核心逻辑槽函数

void MainWindow::onFormatPainterTriggered()
{
    // 如果当前没有激活格式刷,则拾取当前光标处的格式
    if (!m_isFormatPainterActive) {
        QTextCursor cursor = textEdit->textCursor();
        if (cursor.hasSelection()) {
            m_copiedFormat = cursor.charFormat(); // 拾取选中文本的格式
        } else {
            m_copiedFormat = cursor.charFormat(); // 拾取光标所在位置的格式
        }
        m_isFormatPainterActive = true;
        m_formatPainterAction->setChecked(true); // 让按钮保持按下状态
        // 改变鼠标光标形状,提示用户进入格式刷模式
        textEdit->viewport()->setCursor(Qt::PointingHandCursor);
        qDebug() << "格式刷已激活,拾取了格式。";
    } else {
        // 如果已经激活,再次点击意味着锁定/解锁连续模式
        m_isFormatPainterLocked = !m_isFormatPainterLocked;
        if (m_isFormatPainterLocked) {
            m_formatPainterAction->setIcon(QIcon(":/icons/format_painter_locked.png"));
            qDebug() << "格式刷已锁定,可连续应用格式。";
        } else {
            // 解锁则直接退出格式刷模式
            deactivateFormatPainter();
        }
    }
}

// 一个辅助函数,用于退出格式刷模式
void MainWindow::deactivateFormatPainter()
{
    m_isFormatPainterActive = false;
    m_isFormatPainterLocked = false;
    m_formatPainterAction->setChecked(false);
    m_formatPainterAction->setIcon(QIcon(":/icons/format_painter.png"));
    textEdit->viewport()->setCursor(Qt::IBeamCursor); // 恢复文本光标
    qDebug() << "格式刷已关闭。";
}

第四步:在文本编辑区域应用格式 我们需要重写或事件过滤器来处理文本编辑区域的鼠标点击事件,以应用拾取的格式。这里为了简化,我们假设在textEdit的鼠标释放事件中处理:

// 在MainWindow初始化时安装事件过滤器
textEdit->viewport()->installEventFilter(this);

// 事件过滤器函数
bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
    if (obj == textEdit->viewport() && event->type() == QEvent::MouseButtonRelease && m_isFormatPainterActive) {
        QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);
        // 找到鼠标释放位置的文本光标
        QTextCursor cursor = textEdit->cursorForPosition(mouseEvent->pos());
        cursor.mergeCharFormat(m_copiedFormat); // 应用拾取的格式

        // 如果不是锁定模式,应用一次后就退出
        if (!m_isFormatPainterLocked) {
            deactivateFormatPainter();
        }
        return true; // 事件已处理
    }
    return QMainWindow::eventFilter(obj, event); // 其他事件交给父类处理
}

这个例子虽然只是一个简化版,但它清晰地展示了如何将一个复杂的交互逻辑封装在一个自定义的QAction及其相关状态管理中。通过这个练习,你应该能感受到,自定义QAction的真正威力在于它能让你以面向对象的方式,将离散的用户操作组织成有状态的、智能的业务模块。

5. 避坑指南与性能优化

在多年的Qt开发中,我在QAction和工具栏上踩过的坑可真不少。这里分享几个最常见的,希望能帮你省下不少调试时间。

第一个大坑:对象生命周期与内存泄漏。 如果你用代码动态创建QAction,务必指定父对象(Parent)。就像我在代码示例里写的 new QAction(this),这里的this(通常是主窗口)会成为Action的父对象。当父对象被销毁时,Qt的对象树机制会自动清理它的所有子对象,包括这个Action。如果你忘了指定,或者错误地指定了一个生命周期更短的对象作为父对象,就可能导致内存泄漏或程序崩溃。对于在Designer里创建的Action,你不用担心这个,Qt的uic工具生成的代码会自动处理好父子关系。

第二个坑:信号槽连接失效。 这通常发生在你deleteLater了一个Action,或者它的父对象,但其他地方还保持着连接。在C++11之后,我强烈推荐使用新式语法连接信号槽:connect(sender, &SenderClass::signal, receiver, &ReceiverClass::slot)。这种语法在编译时就会做类型检查,比老式的SIGNAL()和SLOT()宏安全得多。如果你的槽函数需要接收一个bool参数表示是否选中(对于checkable的Action),记得连接的是QAction::toggled(bool)信号,而不是triggered()。triggered()对于可勾选Action,只在用户交互导致状态改变时发射,而toggled(bool)在任何状态改变时(包括代码调用setChecked())都会发射。

第三个坑:国际化(i18n)的疏忽。 记住,所有展示给用户的文本(setText(), setToolTip(), setStatusTip())都应该用tr()函数包裹起来。这样Qt的翻译工具(lupdate)才能提取这些字符串,方便你为应用提供多语言支持。不要等到项目后期再回来加tr(),那会是一项繁琐且易错的工作。

关于性能: 工具栏上的按钮数量不是越多越好。虽然Qt本身很高效,但过多的按钮会挤占界面空间,让用户眼花缭乱。我个人的经验法则是,一个工具栏最好不要超过10-15个核心按钮。对于不常用的功能,可以考虑放到下拉菜单里,或者使用“工具栏定制”功能,允许用户自己选择显示哪些按钮。Qt提供了QToolBar的addWidget()方法,你甚至可以放入一个QComboBox或QLineEdit作为搜索框,这比用Action模拟要灵活和高效得多。

最后,一个容易被忽略但能极大提升用户体验的细节:状态提示。除了ToolTip(鼠标悬停时的小黄框),别忘了还有StatusTip。当鼠标悬停在工具栏按钮上时,在主窗口底部的状态栏(QStatusBar)里显示更详细的操作说明,会让你的应用显得非常专业。设置方法很简单:actionSave->setStatusTip(tr("将当前文档保存到磁盘"))。然后在主窗口初始化时调用statusBar()->show()启用状态栏即可。

Qt QAction动作——菜单栏、工具栏、状态栏 菜单栏 阅读详情

相关推荐

QT学习笔记--QAction类

QAction类:     QAction类提供了抽象的action用于放置在窗口部件中,用户可以通过菜单栏按钮,工具栏按钮,快捷方式选择action,因此QAction类中保存了文本名称、快捷方式、图标、显示状态等,下面一一解释。 QAction类的构造函数为:QAction(const QString &text, QObject* parent); QAction(const QIco

qq_36076153的博客 6843

QT5.14入门教程GUI(15)第15个QT程序-Action动作编辑事件-菜单栏

本篇文章接上篇;在基础上添加动作;QT5.14入门教程GUI(14)第14个QT程序-关于对话框-模态对话框非模态对话框 以下是和这篇基本差不多; QT5.14入门教程GUI(11)第11个QT程序-菜单栏-工具栏-MenuBar_ToolBar 1、在主页,双击,打开编辑页面; 2、在下面Action Editor 中,右键,新建; 3、新建动作;如下; 4、在新建的动作中,右键,转到槽;编辑动作; 5、如下代码; 6、在主页最上面;菜单栏中,双击(在...

airanl的博客 4855

QT界面QMenuBar()、QMenu()和QAction()的使用

QMenuBar: 就是所有窗口的菜单栏,在此基础上添加不同的QMenu和QAction QMenu: 菜单栏里面菜单,可以显示文本和图标,但是并不负责执行操作,有点类似label的作用 QAction: Qt 将用户与界面进行交互的元素抽象为一种“动作”,使用QAction类表示。QAction才是真正负责执行操作的部件。 建立一个菜单栏,基本上要三步: MainWindow.h文件 publ...

qq_36881934的博客 6384

QAction系列详解

QAction系列详解 一、QAction类详解 【详细描述】         QAction类提供了抽象的用户界面action,这些action可以被放置在窗口部件中。         应用程序可以通过菜单,工具栏按钮以及键盘快捷键来调用通用的命令。由于用户期望每个命令都能以相同的方式执行,而不管命令所使用的用户界面, 这个时候使用action来表示这些命令就显得十分有用。

chenlong12580的专栏 5万+

QT 菜单栏或者工具栏中 添加【任意】部件

方法1 UI界面添加:拖动法——用于QAction类 创建action直接拖动 方法2 代码添加:addWidget()函数法——用于所有的组件 1.工具栏 添加任意部件的方法: 先实例化(申请想要添加部件的内存空间),再用addWidget函数。如下 //工具栏中添加一个按钮(QPushButton) QPushButton* btn = new QPushButton(this...

仲羊的博客 2122

Qt中QAction类的简单使用

Qt中QAction类的简单使用QAction类是Qt中用于创建菜单项和工具栏按钮的类。下面我们来看一下如何使用QAction类。 将QAction添加到菜单或者工具栏中 连接QAction的信号槽函数 实现QAction的信号槽函数 完整的代码如下:

DevWizard的博客 2238

Qt5 新建自定义action时无法找到QWidgetAction的办法

新建的时候选择基类为QWidget类,新建好项目之后,在自定义的类中加入include&lt;QWidgetAction&gt;,并将类的继承由QWidget改为QWidgetAction即可。

qq_28082341的博客 1688

LEfSe分析避坑指南:如何解决R语言中的常见错误与优化结果可视化

本文提供了R语言中进行LEfSe(线性判别分析)微生物组差异分析的全流程避坑指南。详细解析了从数据格式准备、参数调优(如显著性水平与LDA阈值)、结果可靠性验证到使用ggplot2进行高级可视化的实战技巧,帮助用户规避常见错误,获得更稳健、美观的分析结果。

weixin_29098391的博客 362

qtDesigner中添加QAction

在视图里面打开ActionEditor就可以添加

资资的博客 3194

Hermes+MemOS记忆系统:用SQLite构建可编辑AI个人认知资产

AI记忆不是简单延长上下文或叠加RAG,而是构建具备分层存储、混合检索与自然语言反馈能力的个人认知资产。其核心原理在于将用户交互痕迹(L1)、偏好策略(L2)、结构化世界模型(L3)和结晶化技能统一管理,实现记忆的可追溯、可修正、可进化。技术价值体现在降低token消耗、提升长程一致性、支持离线演进,并突破传统‘静态快照’式知识库局限。典型应用场景包括个人知识助手、客服工单分析Agent、研发文档理解系统等。本文聚焦Hermes Agent与MemOS深度集成方案,详解SQLite作为ACID底座支撑L1/

weixin_33623304的博客 434

VS2022+Qt6保姆级环境配置指南:从插件安装到项目互通全流程

本文提供VS2022与Qt6深度整合的全流程指南,涵盖环境配置、插件安装、项目互通等关键步骤。详细解析编译器版本匹配、跨IDE协作方案及效能优化技巧,帮助开发者高效搭建C++界面设计开发环境,实现软件项目无缝互通。

zero1的博客 735

【Qt | QAction】Qt 的 QAction 类介绍

👉本文介绍了Qt的 QActioin 类,详细介绍了该类重要的信号、槽函数。

wkd_007的博客 3581

基于ESP32-S3与模块化设计的立创桌面充电站:从硬件架构到Web控制实战

本文详细介绍了基于ESP32-S3与模块化设计的立创桌面充电站项目,涵盖从硬件架构到Web控制的全流程实战。项目采用模块化设计,支持自由组合快充模块,并通过ESP32-S3实现智能监控,用户可通过本地网页实时查看各接口电压、电流与功率数据。文章重点解析了基板、连接板与充电模块三大核心部件的设计,特别是大电流PCB的“开窗贴铜”处理技巧,并提供了固件刷写与Web控制面板的配置指南。

weixin_36122351的博客 294

Qt学习:QAction系列详解

一、QAction类详解 【详细描述】         QAction类提供了抽象的用户界面action,这些action可以被放置在窗口部件中。         应用程序可以通过菜单,工具栏按钮以及键盘快捷键来调用通用的命令。由于用户期望每个命令都能以相同的方式执行,而不管命令所使用的用户界面, 这个时候使用action来表示...

优快云博客 1万+

国家自然基金回避专家有必要填写吗?被回避专家能看到吗?

不填也能中填1–2个最保险只填1个最直接竞争者。✅一句话结论可以不填,但建议填1–2个被回避专家绝对看不到如果你愿意,我可以再告诉你一个很多人不知道的国家自然基金“评审分组规则”——它其实决定了你的项目最可能送到哪些专家手里,这对地区基金中标率影响很大。

qq_15963745的博客 157

华为OD机试双机位C卷-流水线(Py/Java/C/C++/Js/Go)

华为OD机试双机位C卷 流水线,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解。华为OD机试 - 流水线。

qq_45776114的博客 2268

QT中QToolBar中如何添加QAction控件

1、问题 我们常常使用QT来创建界面时,一般有两种选择,一是在代码中设计添加控件, 而是直接利用QT design来设计界面。 在需要向菜单栏和工具栏中添加一些按钮或者控件时,发现找不到一个可以使用的按钮或控件, 这些需要使用一个QAction的对象来替代。 添加的方法其一是在源代码中添加QAction,并设计其属性以及信号槽;其二可以直接利用QT design

yangzijiangtou 1万+

KEPServerEX 6 之 EX 6.11.718.0 发布说明

KEPServerEX 6.11.718.0 发布说明

-雲飛兄-博客 2882

qt - QAction

官方介绍 The QAction class provides an abstract user interface action that can be inserted into widgets. In applications many common commands can be invoked via menus, toolbar buttons, and keyboard shortcuts. Since the user expects each command to be perfor

tuan8888888的博客 625

使用 Simulink 进行电力电子系统的大信号模型仿真

电力电子系统(Power Electronics System)包括各种功率转换器(如 DC-DC 转换器、逆变器等)。这些设备中的关键组件(如 MOSFET、IGBT、电容器、电感器等)不仅影响系统的性能,还直接关系到系统的稳定性、效率和可靠性。因此,在设计阶段进行详细的建模和仿真至关重要。大信号模型仿真的目的是通过模拟系统在非线性条件下的真实行为,评估其瞬态响应、稳态性能以及对不同负载和输入电压变化的响应。通过本教程,我们介绍了如何使用 Simulink 进行电力电子系统的大信号模型仿真。背景介绍。

xiaoheshang_123的博客 305

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Qt 动作(QAction)

   Qt 使用QAction类作为动作,QAction包含了图标、菜单文字、快捷键、状态栏文字、浮动帮助等信息,Qt自己选择使用哪个属性来显示,无需我们关心。同时,Qt 能够保证把QAction对象添加到不同的菜单、工具栏时,显示内容是同步的。也就是说,如果我们在菜单中修改了QAction的图标,那么在工具栏上面这个QAction所对应的按钮的图标也会同步修改。#include "mainwin...

qq_33867195的博客 1万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

qaction不显示_Qt 中QAction用addAction添加到QToolbar不能显示怎么破

QAction类提供了抽象的用户界面32313133353236313431303231363533e58685e5aeb931333339663335action,这些action可以被放置在窗口部件中。应用程序可以通过菜单,工具栏按钮以及键盘快捷键来调用通用的命令。由于用户期望每个命令都能以相同的方式执行,而不管命令所使用的用户界面,这个时候使用action来表示这些命令就显得十分有用。Act...

weixin_39634576的博客 1379

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

QAction类详解

          QAction类提供了抽象的用户界面action,这些action可以被放置在窗口部件中。         应用程序可以通过菜单,工具栏按钮以及键盘快捷键来调用通用的命令。由于用户期望每个命令都能以相同的方式执行,而不管命令所使用的用户界面, 这个时候使用action来表示这些命令就显得十分有用。          Actions可以被添加到菜单和工具栏中,并且可以自动保持在...

冷月醉雪的博客 8230

Qt 菜单栏QMenu、下拉菜单QAction、工具栏QToolBar的使用

Qt 菜单栏QMenu、下拉菜单QAction、工具栏QToolBar的使用

m0_73443478的博客 2549
上一篇: 基因家族Motif分析实战指南:从鉴定到功能注释
下一篇: 解密Valhall架构:用Mali-G78实测告诉你Shader优化的5个关键指标
gitlab7runner
博客等级 码龄4年 78粉丝 1747原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值