天天看點

QT開發小技巧總結更新

1、QPushbutton按鈕設定成“按上按下都不顯示邊框”模式,以下兩行代碼即可實作,效果如下圖所示:

QT開發小技巧總結更新
ui->pushButton->setFlat(true);
ui->pushButton->setStyleSheet("background-color:transparent;");
           

2、QSplitter布局分裂器

實作容器滑動和折疊顯示,可以結合QSplitter和QPushButton實作功能。利用Creator進行布局,将需要進行滑動的容器加入QSplitter中并對QSplitter進行栅格布局,此時,運作程式可實作滑動操作。而要實作折疊顯示,可利用按鈕實作。具體代碼如下:

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QShowEvent>
#include <QEvent>
#include <QMouseEvent>
#include <QResizeEvent>

class QPushButton;
class QSplitter;

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
protected:
    void showEvent(QShowEvent *event) override;
    bool eventFilter(QObject *watched, QEvent *event) override;
    void resizeEvent(QResizeEvent *event) override;
private:
    void init();
    void setBtnPos();
    void setBtnIcon();
public slots:
    void slot_bntClicked();
    void slot_splitterMoved(int pos,int index);
private:
    Ui::MainWindow *ui;
    QPushButton *btnOK;
    bool m_bInitShow;
    bool m_isMin;
};

#endif // MAINWINDOW_H
           

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPushButton>
#include <QSplitter>
#include <QDebug>

#pragma execution_character_set("utf-8")

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    init();
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::init()
{
    m_bInitShow = false;
    m_isMin = false;

    btnOK = new QPushButton(this);
    btnOK->setObjectName(QStringLiteral("btnOK"));
    btnOK->hide();
    btnOK->setFixedSize(15,42);
    btnOK->setIconSize(QSize(15,42));
    btnOK->setStyleSheet("QPushButton{border:none;}"
                         "QPushButton:hover{background-color:red;}"
                         "QPushButton:pressed{background-color:blue}");

    ui->tabWidget1->setMouseTracking(true);
    ui->tabWidget->setMouseTracking(true);
    ui->tabWidget->installEventFilter(this);

    connect(btnOK,SIGNAL(clicked()),this,SLOT(slot_bntClicked()));
    connect(ui->splitter,SIGNAL(splitterMoved(int,int)),this,SLOT(slot_splitterMoved(int,int)));
}

void MainWindow::showEvent(QShowEvent *event)
{
    if(!m_bInitShow)
    {
        setBtnPos();
        setBtnIcon();
        m_bInitShow = true;
    }
    QWidget::showEvent(event);
}

bool MainWindow::eventFilter(QObject *watched, QEvent *event)
{
    if (event->type() == QEvent::MouseMove)
    {
        QMouseEvent *mouseMove = static_cast<QMouseEvent*>(event);
        QRect rect = QRect(0,0,btnOK->width(),ui->tabWidget1->height());
        //qDebug()<<rect;
        //qDebug()<<mouseMove->pos();
        if (rect.contains(mouseMove->pos())) {
            btnOK->show();
        }
        else {
            btnOK->hide();
        }
    }
    return QWidget::eventFilter(watched, event);
}

void MainWindow::resizeEvent(QResizeEvent *event)
{
    ui->splitter->setGeometry(0, 0, ui->centralWidget->width(), ui->centralWidget->height());
    setBtnPos();
    QWidget::resizeEvent(event);
}

void MainWindow::setBtnPos()
{

    btnOK->move(ui->tabWidget1->width() + btnOK->width(),(ui->tabWidget1->height() - btnOK->height())/2);
}

void MainWindow::setBtnIcon()
{
    if(ui->tabWidget1->width()!=0)
    {
        btnOK->setIcon(QIcon(":/left.png"));
    }
    else
    {
        btnOK->setIcon(QIcon(":/right.png"));
    }
}

void MainWindow::slot_bntClicked()
{
    static int ss;
    QList <int> sizeList;

    sizeList.clear();
    qDebug()<<ui->tabWidget1->width();
    if (ui->tabWidget1->width() != 0)
    {
        ss=ui->tabWidget1->width();
        sizeList.append(0);
        sizeList.append(ui->splitter->width());
    }
    else
    {
        if(m_isMin)//最小化時 點選彈出固定大小
        {
            sizeList.append(120);
            sizeList.append(ui->splitter->width() - 120);
            m_isMin = false;
            qDebug()<<"dd";
        }
        else //複原
        {
            sizeList.append(ss);
            sizeList.append(ui->splitter->width() - ss);
            qDebug()<<"2222";
        }
    }
    ui->splitter->setSizes(sizeList);
    setBtnPos();
    setBtnIcon();
    btnOK->hide();
}

void MainWindow::slot_splitterMoved(int pos, int index)
{
    Q_UNUSED(pos)
    Q_UNUSED(index)

    setBtnPos();
    setBtnIcon();
    if(ui->tabWidget1->width()==0)
    {
        m_isMin = true;
    }
}
           

其中,比較關鍵的代碼是ui->splitter->setSizes(sizeList); 可以通過設定QList <int> sizeList的内容實作布局的大小,結合按鈕可實作容器的折疊顯示。

QT開發小技巧總結更新
QT開發小技巧總結更新
QT開發小技巧總結更新
QT開發小技巧總結更新

參考資料:https://blog.csdn.net/taiyang1987912/article/details/50717179

3、自定義插件

參考資料:https://www.cnblogs.com/feiyangqingyun/p/6182320.html

4、觸發一次信号,調用多次槽函數

在某次使用信号槽時,出現實際隻觸發了一次信号,卻多次調用槽函數的現象。經過調研,确定是多次建立了connect的原因,比如我把connect定義在了按鈕的單擊事件中,且信号發射者是個全局對象,那麼每次單擊按鈕就會建立一個連接配接,這就造成了一次信号發射觸發多次槽函數調用的情況。是以,最好将connect定義在構造函數中。

繼續閱讀