2020-09-01

#include "chatlist.h"
#include <QPushButton>
#include <QScrollBar>

ChatList::ChatList(QWidget *parent) : QWidget(parent)
{
    initComponent();
}

ChatList::~ChatList()
{
    delete m_pChatListScrollArea;
}

void ChatList::initComponent()
{
    this->m_pChatListScrollArea = new QScrollArea(this);
    this->m_pChatListScrollArea->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding));
    this->m_pChatListScrollArea->setWidgetResizable(true);
    m_pChatListScrollArea->setStyleSheet("QScrollArea {background-color:transparent;}");

    m_pChatListScrollArea->viewport()->setStyleSheet("background-color:transparent;");
    m_pChatListScrollArea->horizontalScrollBar()->setStyleSheet("QScrollBar{height:0px;}");
    m_pChatListScrollArea->verticalScrollBar()->setStyleSheet("QScrollBar{width:0px;}");

    //setValue()操作滚动条
    this->m_pSCVLayout = new QVBoxLayout(this);
    this->m_pSCVLayout->setSizeConstraint(QVBoxLayout::SetMinAndMaxSize);

    QWidget* widget = new QWidget(this);
    widget->setMinimumSize(72, 32);
    widget->setMaximumSize(80,32);

    int i = 0;
    QString str("pushButton %1");
    QPushButton* pushButton;
    for (i=0; i<100; ++i)
    {
        pushButton = new QPushButton(str.arg(i+1), widget);
        pushButton->setMinimumSize(pushButton->size());
        this->m_pSCVLayout->addWidget(pushButton);
    }
    widget->setLayout(this->m_pSCVLayout);
    this->m_pChatListScrollArea->setWidget(widget);
}




#ifndef CHATLIST_H
#define CHATLIST_H
#include <QWidget>
#include <QScrollArea>
#include <QVBoxLayout>

class ChatList : public QWidget
{
    Q_OBJECT
public:
    explicit ChatList(QWidget *parent = 0);
    ~ChatList();

private:
    void initComponent();

signals:

public slots:

private:
    QScrollArea* m_pChatListScrollArea;
    QVBoxLayout* m_pSCVLayout;
};


#endif // CHATLIST_H



#include "chatlist.h"

#include <QApplication>
#include <QVBoxLayout>

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

    ChatList chatList;
    chatList.show();

    return app.exec();
}

 

### SQL BETWEEN 和 DATEFORMAT 性能比较 在SQL查询中,`BETWEEN` 和 `DATEFORMAT` 是两种常见的用于处理日期范围的工具。然而,它们在性能上的表现可能会因数据量、索引使用情况以及数据库引擎的不同而有所差异。 #### 1. **BETWEEN 的性能分析** `BETWEEN` 是一个直接用于比较范围的运算符。当查询条件为 `column BETWEEN value1 AND value2` 时,数据库引擎会直接利用索引来加速查询过程(如果该列上有索引的话)。这意味着对于带有索引的日期列,`BETWEEN` 可以非常高效地执行范围扫描[^1]。 ```sql SELECT * FROM table_name WHERE date_column BETWEEN '2023-01-01' AND '2023-12-31'; ``` 上述查询可以充分利用 `date_column` 上的索引,从而避免全表扫描。因此,在大多数情况下,`BETWEEN` 是一种高效的解决方案。 #### 2. **DATEFORMAT 的性能分析** `DATEFORMAT` 函数通常用于将日期格式化为特定的字符串形式。如果在查询条件中使用 `DATEFORMAT`,例如 `DATEFORMAT(date_column, '%Y-%m') = '2023-01'`,则会导致数据库引擎无法直接使用索引,因为函数调用会强制数据库对每一行进行计算[^1]。 ```sql SELECT * FROM table_name WHERE DATEFORMAT(date_column, '%Y-%m') = '2023-01'; ``` 在这种情况下,即使 `date_column` 上存在索引,查询优化器也无法利用它,从而可能导致全表扫描,尤其是在数据量较大的情况下,这会显著降低查询性能。 #### 3. **性能对比总结** - 如果目标是基于原始日期值进行范围查询,`BETWEEN` 是更优的选择,因为它能够充分利用索引。 - 如果必须对日期进行格式化后再进行比较,则需要谨慎使用 `DATEFORMAT`,因为它会禁用索引并导致更高的CPU开销。 - 在某些场景下,可以通过提前存储格式化后的日期字段来避免运行时的函数调用,从而提升性能[^1]。 #### 示例代码:优化 `DATEFORMAT` 如果必须使用 `DATEFORMAT`,可以通过以下方式优化查询: ```sql -- 提前计算日期范围,避免运行时调用函数 SELECT * FROM table_name WHERE date_column >= STR_TO_DATE('2023-01', '%Y-%m') AND date_column < STR_TO_DATE('2023-02', '%Y-%m'); ``` 这种方法可以确保索引仍然有效,同时避免了对每一行调用 `DATEFORMAT` 函数。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值