首页 > 其他分享 >用qt designer"设计"出带圆点的单选菜单项

用qt designer"设计"出带圆点的单选菜单项

时间:2022-09-08 00:03:22浏览次数:107  
标签:designer qt triggered align center right 单选 action left

先放张图,也许我们要的是右边的样子,而QT设计器设计出来是左边的样子,那怎么样稍做修改一下,实现右边的效果呢?
另外,据说,在很久以前,QT实际上是可以设计出右边的样子的,但后来QT设计器取消了这个功能.

基础知识QAction
一个action就是一个菜单项,或者是工具栏中的一个按钮,一个action里面可以保存文本,图标,快捷键,tooltips等等信息.
action根据他所在的位置(菜单或者工具栏),会随遇而安,显示出菜单的样子,或者工具栏中的按钮的样子.

用Designer设计出如下样子的菜单

默认的action名字是用数字命名的,看起来比较乱, 修改一下action的名字,修改方法如下

最终的修改效果如图所示

现在的效果就是开头你看到的,所有菜单项目前面都可以打勾勾,但是不能用圆点单选.
再修改一下menu的名字吧,这样如果有多个顶级菜单,好区分.

目前的效果如下:

好了,现在主角出场,QActionGroup
QActionGroup就是能把一堆action归到一个组里面
如果调用他的方法setExclusive(true),那么同时就只能选中一个action.默认就是true

首先,我们来看看系统自动生成的代码(只关心左对齐,右对齐,居中对齐),在ui_mainwindow.h中

//创建left/right/center
action_align_left = new QAction(MainWindow);
action_align_left->setObjectName(QString::fromUtf8("action_align_left"));
action_align_left->setCheckable(true);
action_align_right = new QAction(MainWindow);
action_align_right->setObjectName(QString::fromUtf8("action_align_right"));
action_align_right->setCheckable(true);
action_align_center = new QAction(MainWindow);
action_align_center->setObjectName(QString::fromUtf8("action_align_center"));
action_align_center->setCheckable(true);

//把left/right/center加到样式菜单中
menu_style->addAction(action_align_left);
menu_style->addAction(action_align_right);
menu_style->addAction(action_align_center);                

看到了吗?left/right/center被用addAction的方法加到菜单中,
我们需要中的是,把这三个action删除,然后把他们加到QActionGroup中,并把QActionGroup加到样式菜单中,
代码如下:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

        //先删除
    menuBar()->removeAction(ui->action_align_left);
    menuBar()->removeAction(ui->action_align_right);
    menuBar()->removeAction(ui->action_align_center);

        //再加回来
        QActionGroup* alignGroup = new QActionGroup(this);
        ui->menu_style->addAction(alignGroup->addAction(ui->action_align_left));
        ui->menu_style->addAction(alignGroup->addAction(ui->action_align_right));
        ui->menu_style->addAction(alignGroup->addAction(ui->action_align_center));
}

再点点鼠标,编辑一下slot,加上左对齐,右对齐,居中对齐的响应代码

void MainWindow::on_action_align_left_triggered()
{
        ui->action_align_left->setChecked(true);
}

void MainWindow::on_action_align_right_triggered()
{
        ui->action_align_right->setChecked(true);
}

void MainWindow::on_action_align_center_triggered()
{
        ui->action_align_center->setChecked(true);
}

大功告成,看图:

思考:
本文描述的对齐菜单正好是菜单项中的最后三个菜单,
如果不是最后的三个菜单,怎么办呢?
removeAction好说,但remove后,怎么加进来呢?
我猜想,需要用到这个函数:
void        insertAction(QAction *before, QAction *action)
第二个参数就是我们刚remove的action
那第一个参数又从哪里来呢?应该会用到
QList<QAction *>        actions() const
先取出所有的action,找到三个菜单的最后一个菜单的下一个action,假设是X
然后在X前插入三个action就可以啦!
读者可以自己实践.

代码见  http://q1024.com/files/qt_window-master.zip  000300目录


[2020-12-14]增加
既然已经使用了ActionGroup,有一些细节需要知晓一下.
我们可以不用响应on_action_align_left_triggered/on_action_align_right_triggered/on_action_align_center_triggered,
而是增加一个slot
void on_action_alignment_triggered(QAction* action);
然后执行下面语句来连接slot
QObject::connect(alignGroup, SIGNAL(triggered(QAction *)), this, SLOT(on_action_alignment_triggered(QAction *)));
这样,只需要响应on_action_alignment_triggered就可以处理对齐的三个菜单了.


不过,因为on_action_align_left_triggered/on_action_align_right_triggered/on_action_align_center_triggered可以通过点击鼠标实现,所以多少还是比较方便.
您可以根据你自己的需求来决定用哪个slot来响应(或者都响应)
最后,我把代码和代码执行的时序贴出来:


void MainWindow::on_action_align_left_triggered()
{
    qDebug() << "left " << ui->action_align_left->isChecked() << "\n";
    //这个函数会执行,这条语句是没有意义的,因为用了QActionGroup,已经被选中好啦
        ui->action_align_left->setChecked(true);

    //对left对齐进行处理
}

void MainWindow::on_action_align_right_triggered()
{
    //这个函数会执行,这条语句是没有意义的,因为用了QActionGroup,已经被选中好啦
        ui->action_align_right->setChecked(true);

    //对right对齐进行处理
}

void MainWindow::on_action_align_center_triggered()
{
    //这个函数会执行,这条语句是没有意义的,因为用了QActionGroup,已经被选中好啦
        ui->action_align_center->setChecked(true);

    //对center对齐进行处理
}


void MainWindow::on_action_alignment_triggered(QAction* action)
{
    if (action == ui->action_align_left)
    {
        qDebug() << "left alignment" << "\n";
    }else if (action == ui->action_align_right)
    {
        qDebug() << "right alignment" << "\n";
    }else if (action == ui->action_align_center)
    {
        qDebug() << "center alignment" << "\n";
    }
}

执行结果为:
left  true
left alignment

所以,on_action_align_left_triggered先执行,然后是on_action_alignment_triggered

 

细心的朋友可能会发现调试程序时,有如下输出

QMetaObject::connectSlotsByName: No matching signal for on_action_alignment_triggered(QAction*)

解决方法:
slot的名字不要叫on_action_xxxxxxx
要把on_action_alignment_triggered修改成OnAlignmentTriggered(或者其他什么名字,但格式不要是on_xxx_xxx)
这样就可以了
以下是原因,转载自https://blog.csdn.net/restraint/article/details/9956449

--------------------------------------------------------引用内容--开始-------------------------------------------------------

http://www.civilnet.cn/bbs/browse.php?topicno=4023
今天发现qt程序在运行时命令行窗口会弹出下面的警告:
QMetaObject::connectSlotsByName: No matching signal for ...
但实际功能并没有受影响。网上google了一圈,终于找到原因。
以下转自:http://www.qtforum.org/article/20685/connectslotsbyname.html
After a bit of sleuthing to find the source of all the Qt warnings, “QMetaObject::connectSlotsByName: No matching signal for …”, in our log window/file, here’s what I’ve found.
setupUi calls connectSlotsByName. connectSlotsByName parses the moc_ file in order to connect slots and signal s. The moc_ file contains a list of all the slots for the class. The parser iterates over the list of slot names looking for the following pattern: on_objectName_signal , where on_objectName_signal is the name of the slot, objectName is the object name and signal is the signal . For example, if you have a slot named, on_doneButton_clicked(), the parser looks for an object named doneButton, a signal named clicked and then connects the on_doneButton_clicked() slot to QButton’s signal clicked().
If you follow this naming convention, you do no t need to call the connect() method, no r do you need to connect the signal via the Qt UI editor in VisualStudio. connectSlotsByName will automatically make the connection for you.
So, in order to get rid of the “No matching signal for …” warnings, we need to either follow this naming convention, or make sure no ne of our slot names begin with “on_”. If you have a slot, onDoneButton_clicked, for example, connectSlotsByName will no try to connect it with a signal , no r will emit an warning.
上面大概就是 说:
用VistalStudio里的QtEditer可以自动调用Qt中“connectSlotsByName”即“按空间名称关联槽”的方式进行关 联,
对应的函数必须写成“on_控件名_信号名”的格式;
或者也可以通过connet函数人为显式地将信号和槽关联起来。
但是,如果采用显式 connect的方法的同时,又将槽函数的名字起成了“on_控件名_信号名”的格式,那么就会在运行时弹出 “QMetaObject::connectSlotsByName: No matching signal for”的警告了!


--------------------------------------------------------引用内容--结束-------------------------------------------------------

所以,解决方法就是修改一下slot的名字

标签:designer,qt,triggered,align,center,right,单选,action,left
From: https://www.cnblogs.com/xingzaicpp/p/16667758.html

相关文章

  • QT中修改窗口的标题和图标
    修改窗口标题QT的窗口默认名字是MainWindow,在这里介绍两种方法修改窗口的Title1.直接通过UI设计器修改:我修改成了"我的窗口"运行后,显示如下:好了,我们需要去找下,"......
  • Qt5.14.2使用虚拟键盘
    说明这是关于Qt5(Qt5.1.4.2),QWidget编程使用Qt虚拟键盘(qtvirtualkeyboard)Tag:QT5,Qt,软件盘、虚拟键盘,Widget程序,QML 作者:[email protected] 关键代码启用虚拟键盘......
  • Qt 信号槽连接不成功问题原因汇总
    1.拥有信号槽的类,必须继承QObject,声明Q_OBJECT宏。Qt帮助手册里搜索 “Signals&Slots”,可以看到以下说明:想要使用信号槽,必须继承QObject,必须加Q_OBJECT宏。2.信号......
  • QT之QCompleter的用法--- 最简单的使用方法
    本文讲解最简单的使用方法:QCompleter能实现自动填充功能,方便用户输入,提升用户的体验,一般和QLineEdit与QComboBox搭配起来使用.先来个最简单的示例:QStringListword_l......
  • qt中json字符串的读写
    1、json字符串: 2、写json:  3读json:  ......
  • QT布局QGridLayout QHBoxLayout QVBoxLayout简要分析
    在分析之前,先吐槽下M$的MFC,竟然没有相对布局!(至少我不知道,每次都是代码中控制布局),(2022-09-07星仔批注,MFC从VS2015开始就有布局了,功能精炼)M$这么多年,也不发展......
  • [转载]Qt内存泄漏总结(包括检测工具)
    原文链接:http://blog.csdn.net/taiyang1987912/article/details/29271549关于堆栈不清楚的可以参考这篇文章:http://blog.csdn.net/c_base_jin/article/details/25558929一......
  • [转]QT designer中的快捷键
    今天看了看QtDesigner的帮助文档,里面提到了不少快捷键,相信在以后会用的比较多。和大家分享一下:F2:编辑控件名称F3:进入QWidget编辑模式F4:进入SIGNAL/SLOT编辑模式Ctrl+R......
  • QT4.8.6+mingw+qtcreator4.13.3 搭建环境+调试QT源码
    本文测试环境:win7x64由于考虑到跨平台的原因,本安装不基于visualstudio的插件来安装,这样的开发环境和linux更接近.三个文件请准备好:i686-4.8.2-release-posix-dwarf-r......
  • QT Edit Buddies的理解
    这个是用于设置QLabel的buddy的。在这个模式下,可以把QLabel跟其它控件连起来。QLabel可以设置快捷键,当按下快捷键后,窗口焦点就移动到与它连接扩控件上。比如一个QLabel显示......