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.youkuaiyun.com/taiyang1987912/article/details/50717179
3、自定义插件
参考资料:https://www.cnblogs.com/feiyangqingyun/p/6182320.html
4、触发一次信号,调用多次槽函数
在某次使用信号槽时,出现实际只触发了一次信号,却多次调用槽函数的现象。经过调研,确定是多次建立了connect的原因,比如我把connect定义在了按钮的单击事件中,且信号发射者是个全局对象,那么每次单击按钮就会建立一个连接,这就造成了一次信号发射触发多次槽函数调用的情况。所以,最好将connect定义在构造函数中。