QToolButton 設置 工具欄圖標和文字一起顯示


 

設置屬性即可。

Qt::ToolButtonIconOnly                //只顯示圖標

Qt::ToolButtonTextOnly      //只顯示文字

Qt::ToolButtonTextBesideIcon   //  文字在圖標旁邊

Qt::ToolButtonTextUnderIcon    // 文字在圖標下面

Qt::ToolButtonFollowStyle   //  遵循QStyle::StyleHint

ui->mainToolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);

自定義窗口及拖動

1.自定義無邊框窗口時,需要將窗口標志設為:

Qt::FramelessWindowHint |Qt::WindowSystemMenuHint | Qt::WindowMinMaxButtonsHint

 

2.然后還需要通過安裝EventFilter給自己監視窗口拖動

其中構造函數實現:

復制代碼
myUi::myUi(QWidget *parent) :
    QWidget(parent)
{

setWindowFlags(Qt::FramelessWindowHint |Qt::WindowSystemMenuHint | Qt::WindowMinMaxButtonsHint);
    qApp->installEventFilter(this);                   //給自己加事件過濾器,用來實現拖動窗口
    ... ...
} 
復制代碼

eventFilter事件處理函數實現:

復制代碼
bool myUi::eventFilter(QObject *obj, QEvent *evt)
{
    QMouseEvent *mouse =  dynamic_cast<QMouseEvent *>(evt);
    if(obj == this&&mouse)                 //判斷拖動
    {
        if(this->isMaximized())
        {
            return true;
        }
        static bool dragFlag = false;
        static QPoint dragPoint(0,0);
         if(mouse->button()==Qt::LeftButton && mouse->type() ==QEvent::MouseButtonPress)    //按下
        {
            dragFlag =true;
            dragPoint = mouse->pos();                                  //記錄鼠標所在的界面位置
            return true;
        }
        else if(dragFlag &&  mouse->type() ==QEvent::MouseMove)     //拖動
        {
            this->move(mouse->globalPos() - dragPoint);
            return true;
        } 
        else if(mouse->type() ==QEvent::MouseButtonRelease)
        {
            dragFlag = false;
            return true;
        }
    }
    
       return QWidget::eventFilter(obj,evt);
}
復制代碼

 

 

 

自定義QToolButton/QPushButton開關按鈕

1.以QToolButton為例,構造函數里實現:

復制代碼
myUi::myUi(QWidget *parent) :
    QWidget(parent)
{
       //... ...
ui->ToolButton->setText("更新設置");
ui->ToolButton->setIcon( QIcon(":/image/ok.png"));
connect(ui->ToolButton ,SIGNAL(clicked()),this,SLOT(onPageStartBtnClicked()));
ui->ToolButton->setProperty("START","Up");            //設置為未按下狀態
       //... ...
}
復制代碼

2.槽函數里實現:

復制代碼
void myUi::onPageStartBtnClicked()
{
            if(b->property("START")=="Up")          //之前是未按下
            {
             ui->ToolButton->setProperty("START","Down");     //設置為按下
             ui->ToolButton->setText("取消設置");
             ui->ToolButton->setIcon( QIcon(":/image/colose.png"));
                        //... ...
            }
            else
            {
               ui->ToolButton->setProperty("START","Up");    //設置為未按下狀態
               ui->ToolButton->setText("更新設置");
               ui->ToolButton->setIcon( QIcon(":/image/ok.png"));
            //... ... 
            }
}
復制代碼

3.QSS代碼:

復制代碼
/*正常狀態下*/
QToolButton[START="Up"] {                                                         
        border-radius: 20px;
        border: none;
        padding-left :30px;
        color: rgb(255,255,255);
        background: rgb(56,167,222); 
}

QToolButton[START="Up"]:hover { padding-bottom: 2px; background: rgb(0,205,252); } QToolButton[START="Up"]:checked,QToolButton[START="Up"]:pressed { background: rgb(6,144,175); } /*取消狀態下*/ QToolButton[START="Down"] { border-radius: 20px; border: none;     padding-left :30px;      color: rgb(255,255,255);      background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, stop:0 rgba(255,176,30, 255), stop:0.6 rgba(254,139,91, 255), stop:1.0 rgba(254,176,143, 255)); } QToolButton[START="Down"]:hover { padding-bottom: 2px; background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, stop:0 rgba(255,176,30, 255), stop:0.6 rgba(255,74,0, 255), stop:1.0 rgba(255,183,153, 255)); }
復制代碼

效果

點擊前:

點擊后:

 

 

 

界面陰影

首先,將界面拖放在QFrame子組件里,然后將該QFrame居中,與主窗口間隔10px左右(用來顯示陰影).並將主窗口設為透明屬性.

接下來,有2種方法設置陰影:

1.使用QGraphicsDropShadowEffect圖像陰影效果類

好處在於快捷,只需要在構造函數里實現即可,壞處就是界面有點卡(我這里測試是這樣的)

QGraphicsDropShadowEffect常用函數:

復制代碼
setOffset ( qreal dx, qreal dy );
//設置陰影的偏移度,如果想實現整個界面上下左右都有陰影,則設為dx=0,dy=0.
//當dx為負時,表示偏移為左,反之為右
//當dy為負時,表示偏移為上,反之為下

void setBlurRadius ( qreal blurRadius );
//設置陰影半徑,值越大,則陰影效果越強

setColor ( const QColor & color )
//設置陰影顏色
復制代碼

示例-在構造函數里調用:

復制代碼
   setAttribute(Qt::WA_TranslucentBackground);

   QGraphicsDropShadowEffect* shadowEffect = new QGraphicsDropShadowEffect(this);

   shadowEffect->setOffset(0,0);

   shadowEffect->setColor(QColor(0,0,0));

   shadowEffect->setBlurRadius(10);

   ui->frame->setGraphicsEffect(shadowEffect);
復制代碼

效果:

 

 

2.QPainter繪畫

首先,在構造函數里調用下面函數,設置透明:

setAttribute(Qt::WA_TranslucentBackground);

然后在paintEvent函數里進行繪制

復制代碼
void myUi::paintEvent(QPaintEvent *)  //繪畫陰影
{
       int size =10;                //陰影寬度
       QPainter painter(this);
       painter.setRenderHint(QPainter::Antialiasing);

       QColor color(0, 0, 0, 0);
       for(int i=0;i<=size; i++)
       {
            color.setAlpha(i*4);
            painter.setPen(color);
            painter.setBrush(Qt::transparent);
            painter.drawRoundedRect(i,i,this->width()-i*2, this->height()-i*2,15,15);
       }
}
復制代碼

由於界面是圓角的,所以通過drawRoundedRect()繪制.

效果:

 

 

參考: https://blog.csdn.net/stephan14/article/details/47406881

參考: http://blog.sina.com.cn/s/blog_a6fb6cc90101eoop.html#cmt_53197A33-7F000001-6E85F70F-8B8-8A0

  

但是如果在低於qt 5.1.1版本時,設置QT::FramelessWindowHint和Qt::WA_TranslucentBackground時會出現一個bug:

在最小化還原時界面停止刷新 

參考:https://blog.csdn.net/yiqiyihuiligang/article/details/51438600

 

 

播放聲音

當彈出對話框時,需要播放聲音,可以使用windows自帶的聲音,位置在C:\Windows\Media里

 QSound播放的只有.wav文件,並且比特率不能太高,可以使用格式工廠,把比特率降到三百多 

並且聲音路徑必須是在APP程序的路徑,示例:

    QString dir=QCoreApplication ::applicationDirPath();
    QString filename(dir+"/sound/ok.wav");    //等價於:"./sound/ok.wav"
    qDebug()<<dir;//打印APP路徑
    QSound::play ( filename );

 參考:https://blog.csdn.net/qq_28364283/article/details/50907329

 

 隱藏任務欄

setWindowFlags(Qt::FramelessWindowHint|Qt::Tool);

setAttribute(Qt::WA_TranslucentBackground);

 

 

為什么要隱藏任務欄

比如當我們拖動無邊框界面時,需要繪制界面邊框線,如果不隱藏的話,就會出現兩個任務欄圖標


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM