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

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的内容實作布局的大小,結合按鈕可實作容器的折疊顯示。
參考資料:https://blog.csdn.net/taiyang1987912/article/details/50717179
3、自定義插件
參考資料:https://www.cnblogs.com/feiyangqingyun/p/6182320.html
4、觸發一次信号,調用多次槽函數
在某次使用信号槽時,出現實際隻觸發了一次信号,卻多次調用槽函數的現象。經過調研,确定是多次建立了connect的原因,比如我把connect定義在了按鈕的單擊事件中,且信号發射者是個全局對象,那麼每次單擊按鈕就會建立一個連接配接,這就造成了一次信号發射觸發多次槽函數調用的情況。是以,最好将connect定義在構造函數中。