自定义了一个标题栏类TitleLayout

直接上代码,大家在以后的开发中根据实际需求可以做一些修改。

/**
 * Created by 杨阳洋 on 2016/12/9.
 */

public class TitleLayout extends LinearLayout {
    private Button mBtn_back;
    private Button mBtn_next;

    public TitleLayout(Context context) {
        this(context,null);
    }

    public TitleLayout(Context context, AttributeSet attrs) {
        this(context, attrs,0);
    }

    public TitleLayout(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        //参数2:是给加载好的布局再添加一个父布局
        LayoutInflater.from(context).inflate(R.layout.title,this);

        initData();

        initListener();
    }

    private void initData() {
        mBtn_back = (Button) findViewById(btn_back);
        mBtn_next = (Button) findViewById(btn_next);
    }

    private void initListener() {
        mBtn_back.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                ((Activity)getContext()).finish();
            }
        });

        mBtn_next.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(getContext(), R.string.app_name , Toast.LENGTH_SHORT).show();
            }
        });
    }
}

布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:background="@drawable/title_bg"
              android:orientation="horizontal">

    <Button
        android:id="@+id/btn_back"
        android:layout_width="20dp"
        android:layout_gravity="center"
        android:layout_height="20dp"
        android:layout_marginLeft="5dp"
        android:background="@drawable/ic_back"
        android:gravity="center"/>

    <TextView
        android:id="@+id/title_text"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:gravity="center"
        android:layout_gravity="center_vertical"
        android:text="@string/title"
        android:textSize="20sp"/>

    <Button
        android:id="@+id/btn_next"
        android:layout_width="20dp"
        android:layout_height="20dp"
        android:layout_marginRight="5dp"
        android:layout_gravity="center"
        android:background="@drawable/ic_back01"
        android:gravity="center"/>
</LinearLayout>
### Qt 中自定义窗口标题栏和背景框 #### QWidget 及其子窗体组件的默认行为 QWidget及其子窗体组件的标题栏通常由操作系统控制,这意味着标题栏会遵循操作系统的主题风格[^1]。然而,在实际项目开发过程中,为了提升应用美观度,开发者往往希望定制化这些元素。 #### 自定义标题栏的功能特性 通过隐藏标准标题栏并创建一个新的顶部区域来模拟传统标题栏的行为可以实现这一点。此新构建的部分能够容纳诸如最小化、关闭按钮以及可能的应用程序特定控件等元素[^2]。 对于具体实施而言: - **设置无边框样式**: 使用 `setWindowFlags(Qt::FramelessWindowHint)` 方法去除原有框架。 - **设计UI布局**: - 添加 QLabel 或其他适合显示文本的对象作为标题文字; - 插入 QPushButton 组件用于表示各个动作(如最小化、最大化/还原、关闭); - 如果有需求的话还可以加入 QToolButton 来放置左侧的品牌Logo或其他装饰性图像文件; 下面是一个简单的例子展示如何完成上述描述的操作: ```cpp // mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QPushButton> class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = nullptr); protected: void mousePressEvent(QMouseEvent* event); void mouseMoveEvent(QMouseEvent* event); private slots: void onMinimizeClicked(); void onCloseClicked(); private: bool m_dragging; QPoint m_mousePressPosition; }; #endif // MAINWINDOW_H // mainwindow.cpp #include "mainwindow.h" #include <QVBoxLayout> #include <QLabel> #include <QSpacerItem> #include <QApplication> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), m_dragging(false){ setWindowFlags(windowFlags() | Qt::FramelessWindowHint); // Remove default window frame. auto layout = new QVBoxLayout(this); layout->setContentsMargins(0, 0, 0, 0); layout->setSpacing(0); // Create custom title bar. QWidget* titleBarWidget = new QWidget(this); QHBoxLayout* titleLayout = new QHBoxLayout(titleBarWidget); titleLayout->setContentsMargins(5, 0, 5, 0); QLabel* titleLabel = new QLabel("My Application", this); titleLayout->addWidget(titleLabel); QSpacerItem* spacer = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); titleLayout->addSpacerItem(spacer); QPushButton* minimizeBtn = new QPushButton("-", this); connect(minimizeBtn, &QPushButton::clicked, this, &MainWindow::onMinimizeClicked); titleLayout->addWidget(minimizeBtn); QPushButton* closeBtn = new QPushButton("X", this); connect(closeBtn, &QPushButton::clicked, this, &MainWindow::onCloseClicked); titleLayout->addWidget(closeBtn); layout->addWidget(titleBarWidget); } void MainWindow::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton && !m_dragging) { m_dragging = true; m_mousePressPosition = event->globalPos() - pos(); event->accept(); } } void MainWindow::mouseMoveEvent(QMouseEvent *event) { if (m_dragging && (event->buttons() & Qt::LeftButton)) { move(event->globalPos() - m_mousePressPosition); event->accept(); } } void MainWindow::onMinimizeClicked(){ showMinimized(); } void MainWindow::onCloseClicked(){ QApplication::quit(); } ``` 这段代码展示了如何去掉原有的标题条,并建立自己的带有基本功能的新版本。它还实现了鼠标点击拖动整个窗口的能力,这通常是原生标题条的一部分特征之一[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值