ZBLOG

可否在此需求的基础上,封装一个类,用于替换不同窗口的标题栏,且标题栏中的控件可以实现不同效果:单击操作、多选列表等

当然可以!你可以根据需要封装一个自定义的标题栏类,用于替换不同窗口的标题栏,并在其中添加不同类型的控件以实现单击操作、多选列表等功能。以下是一个示例代码:

#include <QtWidgets>

class CustomTitleBar : public QWidget {
public:
    CustomTitleBar(QWidget *parent = nullptr) : QWidget(parent) {
        setFixedHeight(30);

        QHBoxLayout *layout = new QHBoxLayout(this);
        layout->setContentsMargins(0, 0, 0, 0);

        titleLabel = new QLabel("Custom Title Bar", this);
        layout->addWidget(titleLabel);

        menuButton = new QPushButton("Options", this);
        connect(menuButton, &QPushButton::clicked, this, &CustomTitleBar::showOptionsMenu);
        layout->addWidget(menuButton);

        menu = new QMenu(this);
        QActionGroup *actionGroup = new QActionGroup(this);
        
        // 添加单击操作菜单项
        QAction *singleClickAction = new QAction("Single Click", this);
        singleClickAction->setCheckable(true);
        singleClickAction->setChecked(true); // 默认选中状态
        actionGroup->addAction(singleClickAction);
        
         // 添加多选列表菜单项
         QMenu* multiSelectSubMenu = menu->addMenu("Multi Select");
         QAction* option1Action = multiSelectSubMenu->addAction("Option 1");
         option1Action->setCheckable(true); // 设置为可选择项
         option1Action->setChecked(false); // 默认未选中状态

         QAction* option2Action = multiSelectSubMenu->addAction("Option 2");
         option2Action->setCheckable(true); // 设置为可选择项
         option2Action->setChecked(false); // 默认未选中状态
         
        actionGroup->addAction(option1Action);
        actionGroup->addAction(option2Action);

        menu->addSeparator();
        
        connect(actionGroup, &QActionGroup::triggered, this, &CustomTitleBar::handleMenuSelection);
    }

signals:
    void optionSelected(const QString &option);

private slots:
    void showOptionsMenu() {
        menuButton->setMenu(menu);
        menuButton->showMenu();
    }

    void handleMenuSelection(QAction *action) {
        if (action && action->isChecked()) {
            emit optionSelected(action->text());
            if (action == titleLabel) {
                titleLabel->setText("Clicked: " + action->text());
            }
            else{
                titleLabel->setText("Custom Title Bar");
            }
        }
    }

private:
    QLabel *titleLabel;
    QPushButton *menuButton;
    QMenu *menu;
};

class CustomWindow : public QWidget {
public:
    CustomWindow(QWidget *parent = nullptr) : QWidget(parent) {
        QVBoxLayout* layout = new QVBoxLayout(this);

        CustomTitleBar* titleBarWidget = new CustomTitleBar(this);
        layout->addWidget(titleBarWidget); // 将自定义标题栏添加到布局中

        contentWidget = new QTextEdit(this); // 添加其他内容部件
        layout->addWidget(contentWidget); // 将内容部件添加到布局中

       QObject::connect(titleBarWidget, &CustomTitleBar::optionSelected,
                        [&](const QString& option) { handleOptionSelected(option); });
   }

private slots:
   void handleOptionSelected(const QString& option) {
       if (option == "Single Click") {
           QMessageBox::information(this, "Option Selected", "Single Click Option selected.");
       } else if (option == "Option 1" || option == "Option 2") {
           QMessageBox::information(this, "Option Selected", option + " selected.");
       }
   }

private:
   QTextEdit* contentWidget;
};

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    CustomWindow window;
    window.setWindowTitle("Custom Window");
    window.resize(400, 300);
    window.show();

    return app.exec();
}

在这个示例代码中,我们创建了一个CustomTitleBar类用于自定义标题栏,并添加了单击操作菜单项和多选列表菜单项。通过与信号槽的连接,当菜单项被选择时会发出相应的信号。我们还创建了一个CustomWindow类作为窗口主体,在其中使用了自定义的标题栏,并演示了不同选项的处理逻辑。

你可以根据需要进一步扩展和定制CustomTitleBar类,以实现更多功能和效果。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=13835

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?