小鸟游菜花 2024-05-12 19:15 采纳率: 86.5%
浏览 4

QT想实现这样的效果,不知道哪里错了

#include "widget.h"
#include<QHBoxLayout>
#include<QVBoxLayout>
#include<QPushButton>
#include<QButtonGroup>

widget::widget(QWidget *parent)
    : QMainWindow(parent)
{



    // 1. 整体是水平布局
    QHBoxLayout* horizontalLayout = new QHBoxLayout(this);
    //setSpacing 方法用于设置布局中控件之间的间距。
    //局中控件之间的间距为0,这意味着控件之间将没有额外的空间
    horizontalLayout->setSpacing(0);
    //setContentsMargins 方法用于设置布局在其父容器中的边距
    //这四个参数分别代表上、左、下、右四个方向的边距大小。
    //设置布局的内容边距为0,布局的内容紧贴其父容器的边缘
    horizontalLayout->setContentsMargins(0, 0, 0, 0);


    // 2. 左侧导航窗口是垂直布局
    navWidget = new QWidget(this);
    QVBoxLayout* leftLayout = new QVBoxLayout(navWidget);
    leftLayout->setSpacing(0);
    leftLayout->setContentsMargins(0, 0, 0, 0);

    // 将leftwidget添加到整体的水平布局中
    // addWidget 是 QHBoxLayout 类的一个成员函数
    // 用于将一个控件添加到布局中
    horizontalLayout->addWidget(navWidget);

    // 3. 右侧主体布局 右侧也是垂直布局
    mainWidget = new QWidget(this);
    mainWidget->setMinimumWidth(400);
    QVBoxLayout* rightLayout = new QVBoxLayout(mainWidget);
    rightLayout->setSpacing(0);
    rightLayout->setContentsMargins(5, 5, 5, 5);
    stackedWidget = new QStackedWidget(mainWidget);

    rightLayout->addWidget(stackedWidget);

    horizontalLayout->addWidget(mainWidget);
    //设置左侧导航窗按钮
    rightbotton();
}

widget::~widget() {}

void widget::rightbotton()
{
    QStringList names;
    names<<"鼠标进入/离开"
          <<"鼠标按下/移动/释放"
          <<"键盘事件"
          <<"定时器事件"
          <<"拖动事件"
          <<"绘图事件"
          <<"右键菜单"
          <<"总结:事件的传递流程";

    //创建一个按钮组,用于统一管理按钮
    //QButtonGroup的主要用途是组织和管理一组按钮
    btngroup=new QButtonGroup(this);
    for(int i=0;i<names.count();i++)
    {
        //插入按钮
        QPushButton *btn =new QPushButton;

        //设置固定高度
        btn->setMinimumHeight(60);

        //设置文字
        btn->setText(QString("%1.%2").arg(i+1,2,10,QChar('0')).arg(names.at(i)));
        // %1 是占位符,它将被 arg() 方法的第一个参数替换。
        // i+1 是我们想要插入的整数值。
        // 2 指定了字段宽度,即输出的最小字符数。
        // 10 指定了基数(对于整数,这通常是 10,表示十进制)。
        //  QChar('0') 指定了用于填充字段的字符(在这种情况下是前导零)。


        //设置按钮可选中,类似于复选框的功能
        btn->setCheckable(true);

        //设置按钮字体
        //设置leftwidget窗口中的按钮字体大小
        //整个样式表是一个字符串
        navWidget->setStyleSheet(R"(
            QPushButton {
                    font: 25px;
                    text-align : left;
            }
        )");

        //将按钮添加到按钮组
        btngroup->addButton(btn,i);

        //把按钮添加到leftwidget左侧布局里
        navWidget->layout()->addWidget(btn);

    }
}

#ifndef WIDGET_H
#define WIDGET_H

#include <QMainWindow>
#include<QWidget>
#include<QStackedWidget>
#include<QPushButton>

class widget : public QMainWindow
{
    Q_OBJECT

public:
    widget(QWidget *parent = nullptr);
    ~widget();

    void rightbotton();
private:
    //创建一个主视图
    QWidget *mainWidget;

    //创建左侧导航视图窗口
    QWidget *navWidget;

    //创建堆叠窗口
    QStackedWidget *stackedWidget;
    QButtonGroup* btngroup;
};
#endif // WIDGET_H

img

img

img

  • 写回答

4条回答 默认 最新

  • 笑面虎 2024-05-12 19:15
    关注

    以下内容由CHATGPT及笑面虎共同生成、有用望采纳:


    【您想要解决的问题】:您提问的目的是解决在Qt中创建用户界面时遇到的问题,具体来说,您想要实现一个具有左侧导航和右侧主体内容的界面布局,但是遇到了布局管理的问题,导致程序无法正确显示您期望的效果。

    【图片内容】:

    1. 第一张图片显示了您的Qt项目的文件结构和一些关键的UI组件,如水平布局(horizontalLayout)、垂直布局(leftLayout)、导航窗口(navWidget)、主体布局(mainWidget)和按钮组(btngroup)。
    2. 第二张图片显示了一个错误信息,提示您尝试向一个已经有布局的部件(widget)添加一个QLayout,这通常意味着您尝试将一个布局添加到已经有一个布局的部件中。
    3. 第三张图片展示了您希望实现的UI界面的最终效果,包括鼠标事件、键盘事件、定时器事件等的按钮。

    【问题出现原因】:根据您提供的代码和错误信息,问题可能出现在布局的管理上。在Qt中,一个QWidget只能有一个布局(QLayout)作为其子布局。错误信息表明您可能尝试向已经有布局的widget添加了另一个布局。

    【问题解决方案】:为了解决这个问题,您需要确保每个QWidget只有一个QLayout作为其子布局。在您的代码中,您已经为navWidget和mainWidget创建了布局,并且将它们添加到了horizontalLayout中。您需要检查是否有其他地方尝试再次添加布局或者重复设置布局。

    【提供代码】:以下是修改后的代码,我移除了widget构造函数中的一些不必要的代码,并确保了每个QWidget只有一个QLayout:

    #include "widget.h"
    #include <QHBoxLayout>
    #include <QVBoxLayout>
    #include <QPushButton>
    #include <QButtonGroup>
    
    widget::widget(QWidget *parent)
        : QMainWindow(parent)
    {
        // 1. 整体是水平布局
        QHBoxLayout* horizontalLayout = new QHBoxLayout(this);
        horizontalLayout->setSpacing(0);
        horizontalLayout->setContentsMargins(0, 0, 0, 0);
    
        // 2. 左侧导航窗口是垂直布局
        navWidget = new QWidget(this);
        QVBoxLayout* leftLayout = new QVBoxLayout(navWidget);
        leftLayout->setSpacing(0);
        leftLayout->setContentsMargins(0, 0, 0, 0);
        horizontalLayout->addWidget(navWidget);
    
        // 3. 右侧主体布局 右侧也是垂直布局
        mainWidget = new QWidget(this);
        mainWidget->setMinimumWidth(400);
        QVBoxLayout* rightLayout = new QVBoxLayout(mainWidget);
        rightLayout->setSpacing(0);
        rightLayout->setContentsMargins(5, 5, 5, 5);
        stackedWidget = new QStackedWidget(mainWidget);
        rightLayout->addWidget(stackedWidget);
        horizontalLayout->addWidget(mainWidget);
    
        // 设置主窗口的布局
        this->setLayout(horizontalLayout);
    
        // 设置左侧导航窗按钮
        rightbotton();
    }
    
    widget::~widget() {}
    
    void widget::rightbotton()
    {
        // ...(省略中间的按钮创建代码)
    }
    
    // widget.h 文件保持不变
    

    【代码运行方式】:您需要在Qt开发环境中运行这段代码。如果您使用的是Qt Creator,只需打开您的项目,将上述代码替换到相应的源文件中,然后编译并运行程序。

    【代码预期运行结果】:预期中,您的程序将显示一个带有左侧导航和右侧主体内容的界面,且不会出现布局相关的错误。

    【推荐相关链接】:

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 5月12日

悬赏问题

  • ¥15 pyqt怎么把滑块和输入框相互绑定,求解决!
  • ¥20 wpf datagrid单元闪烁效果失灵
  • ¥15 券商软件上市公司信息获取问题
  • ¥100 ensp启动设备蓝屏,代码clock_watchdog_timeout
  • ¥15 Android studio AVD启动不了
  • ¥15 陆空双模式无人机怎么做
  • ¥15 想咨询点问题,与算法转换,负荷预测,数字孪生有关
  • ¥15 C#中的编译平台的区别影响
  • ¥15 软件供应链安全是跟可靠性有关还是跟安全性有关?
  • ¥15 电脑蓝屏logfilessrtsrttrail问题