主窗口的设计与开发(一)

主窗口的设计与开发(一)

前言

        在上一集,我们已经完成了对核心数据结构的开发与相关工具类的开发。这一集,我们将会对主窗口进行设计与开发。那么废话不多说,直接就开始吧。

主窗口设计

主窗口我们需要展示的内容分为三大类:

第一类:左侧标签,包括头像、聊天会话标签、好友标签以及好友申请标签。

第二类:存放会话列表。

第三类:聊天框

这三类将以左中右的样式进行排列。

那么我们就需要创建左中右布局三大板块。

那我们就需要在mainwidget.h当中定义三个成员变量表示三大区域。

QWidget* windowLeft;
QWidget* windowMid;
QWidget* windowRight;

主窗口初始化

接下里我们要编写出主窗口的初始化代码

initMainWindow
void MainWidget::initMainWindow(){
    QHBoxLayout* layout = new QHBoxLayout();
    layout->setSpacing(0);
    layout->setContentsMargins(0,0,0,0);
    this->setLayout(layout);

    windowLeft = new QWidget();
    windowMid = new QWidget();
    windowRight = new QWidget();

    windowLeft->setFixedWidth(55);
    windowMid->setFixedWidth(195);
    windowRight->setMinimumWidth(650);

    windowLeft->setStyleSheet("QWidget { background-color: rgb(46, 46, 46); }");
    windowMid->setStyleSheet("QWidget { background-color: rgb(247, 247, 247); }");
    windowRight->setStyleSheet("QWidget { background-color: rgb(242, 242, 242); }");

    layout->addWidget(windowLeft);
    layout->addWidget(windowMid);
    layout->addWidget(windowRight);



}

这里我们的主窗口的样式布局初始化就已经完成。

接下来我们需要完成左中右的初始化内容。

左窗口初始化

左窗口我们需要放入四个按钮,分别为用户头像、会话标签页按钮、好友标签页按钮以及好友申请标签页按钮。

我们需要在mainwidget.h中创建新的四个成员变量

    //用户头像
    QPushButton* userAvatar;
    //会话标签页按钮
    QPushButton* sessionTabBtn;
    //好友标签页按钮
    QPushButton* friendTabBtn;
    //好友申请标签页按钮
    QPushButton* applyTabBtn;

这里需要注意一下,我们的用户头像也是用了QPushButton,为了是我们在后面点击头像就可以看到自己的详细信息。

我们初始化左窗口的代码虽然看起来长,其实代码逻辑很简单,我们接着往下看。

void MainWidget::initLeftWindow(){
    QVBoxLayout* layout = new QVBoxLayout();
    layout->setSpacing(20);
    layout->setContentsMargins(0,30,0,0);

    windowLeft->setLayout(layout);

    userAvatar = new QPushButton();
    userAvatar->setFixedSize(45,45);
    userAvatar->setIconSize(QSize(45,45));
    userAvatar->setIcon(QIcon(":/resource/image/defaultAvatar.png"));
    userAvatar->setStyleSheet("QPushButton { background-color: transparent; }");
    layout->addWidget(userAvatar,1,Qt::AlignTop | Qt::AlignHCenter);

    sessionTabBtn = new QPushButton();
    sessionTabBtn->setFixedSize(45,45);
    sessionTabBtn->setIconSize(QSize(30,30));
    sessionTabBtn->setIcon(QIcon(":/resource/image/session_active.png"));
    sessionTabBtn->setStyleSheet("QPushButton { background-color: transparent; }");
    layout->addWidget(sessionTabBtn,1,Qt::AlignTop | Qt::AlignHCenter);

    friendTabBtn = new QPushButton();
    friendTabBtn->setFixedSize(45,45);
    friendTabBtn->setIconSize(QSize(30,30));
    friendTabBtn->setIcon(QIcon(":/resource/image/friend_inactive.png"));
    friendTabBtn->setStyleSheet("QPushButton { background-color: transparent; }");
    layout->addWidget(friendTabBtn,1,Qt::AlignTop | Qt::AlignHCenter);

    applyTabBtn = new QPushButton();
    applyTabBtn->setFixedSize(45,45);
    applyTabBtn->setIconSize(QSize(30,30));
    applyTabBtn->setIcon(QIcon(":/resource/image/apply_inactive.png"));
    applyTabBtn->setStyleSheet("QPushButton { background-color: transparent; }");
    layout->addWidget(applyTabBtn, 1, Qt::AlignTop | Qt::AlignHCenter);

    layout->addStretch(20);




}

这里我们会添加一些图片在这些标签上的,这些图片我们使用qrc进行管理。

这边大家可以找自己喜爱的图片放在这些标签页上。

初始化信号槽

我们还有一个需求,默认我们的会话标签是高亮的,其他两个标签是非高亮的。当我们点击其他的标签时,中间的列表会对应变化,并将对应的标签进行高亮。

那么我们就需要对信号槽进行初始化。

initSignalSlot
void MainWidget::initSignalSlot(){
    //信号槽,处理标签按钮切换
    connect(sessionTabBtn, &QPushButton::clicked,this,&MainWidget::switchTabToSession);
    connect(friendTabBtn, &QPushButton::clicked,this,&MainWidget::switchTabToFriend);
    connect(applyTabBtn, &QPushButton::clicked,this,&MainWidget::switchTabToApply);
}

这里只要对某个标签触发了点击事件,就会执行对应的方法,这些方法当中就会完成我们的需求。

在完成这几个方法之前,我们还需要引入一个枚举类和一个默认的成员变量。

enum ActiveTab{
        SESSION_LIST,
        FRIEND_LIST,
        APPLY_LIST
    };
    ActiveTab activeTab = SESSION_LIST;

这个枚举我们将表示目前是处于哪个状态。

switchTabToSession
void MainWidget::switchTabToSession()
{
    //先记录已经切换到了哪个标签页
    activeTab = SESSION_LIST;

    //调整图标的显示情况
    sessionTabBtn->setIcon(QIcon(":/resource/image/session_active.png"));
    friendTabBtn->setIcon(QIcon(":/resource/image/friend_inactive.png"));
    applyTabBtn->setIcon(QIcon(":/resource/image/apply_inactive.png"));

    //主窗口Mid中加载出会话列表
    this->loadSessionList();

}
switchTabToFriend
void MainWidget::switchTabToFriend()
{
    activeTab = FRIEND_LIST;

    sessionTabBtn->setIcon(QIcon(":/resource/image/session_inactive.png"));
    friendTabBtn->setIcon(QIcon(":/resource/image/friend_active.png"));
    applyTabBtn->setIcon(QIcon(":/resource/image/apply_inactive.png"));

    this->loadFriendList();
}
switchTabToApply
void MainWidget::switchTabToApply()
{
    activeTab = APPLY_LIST;

    sessionTabBtn->setIcon(QIcon(":/resource/image/session_inactive.png"));
    friendTabBtn->setIcon(QIcon(":/resource/image/friend_inactive.png"));
    applyTabBtn->setIcon(QIcon(":/resource/image/apply_active.png"));

    this->loadApplyList();
}

这三个成员方法,我们就是将选中的标签设置为光亮,其他设置为非高亮。之后去加载会话列表、好友列表以及好友申请列表。

设置单例模式

最后这一集我们来把这个程序设置单例模式。

private:
    static MainWidget* instance;
    //单例模式需要限制其他人创建实例!!!
    MainWidget(QWidget *parent = nullptr);
public:
    static MainWidget* getInstance();

我们直接把构造函数进行私有化,限制其他人创建实例。

当然我们在主函数那边也要进行修改。

MainWidget* w = MainWidget::getInstance();
    w->show();

我们已经完成了主窗口和左窗口的大概开发,那么这一集先到这里。

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值