2017-07-21 27 views
10

QToolButton(Google Chromeと同様)を使用して"+"new tab button)ボタンを実装するために、QTabBarのクラスを派生しました。しかし、それは私のLinuxマシンでは動作していますが、私のWindowsマシンでは動作しません。私のは私のwindows machineには表示されませんが、私のLinuxマシン(Ubuntu)に表示されていることを意味しません。理由を理解するための実験をほとんど試していないのに、それをデバッグすることはできませんが、うまくいきません。QToolButtonがウィンドウに表示されない

私のソースファイル:

#include "tabbar.h" 

TabBar::TabBar(QWidget *parent) : QTabBar(parent) 
{ 
    new_button_ = new QToolButton(this); 
    new_button_->setObjectName(QStringLiteral("AddButton")); 
    new_button_->setText("+"); 
    new_button_->setFixedSize(QSize(20, 20)); 
    connect(new_button_, SIGNAL(released()), this, SLOT(emit_new())); 
    movePlusButton(); 
} 

QSize TabBar::sizeHint(void) const 
{ 
    QSize old = QTabBar::sizeHint(); 
    return QSize(old.width() + 45, old.height()); 
} 

void TabBar::emit_new(void) 
{ 
    emit newClicked(); 
} 

void TabBar::movePlusButton(void) 
{ 
    quint64 totalWidth = 0; 
    for (long i=0; i < count(); i++) 
     totalWidth += tabRect(i).width(); 

    quint64 h = geometry().top(); 
    quint64 tab_height = height(); 
    quint64 w = width(); 

    if (totalWidth > w) 
     new_button_->move(w-40, tab_height - 30); 
    else 
     new_button_->move(totalWidth + 5, tab_height - 30); 
} 

void TabBar::resizeEvent(QResizeEvent *p_evt) 
{ 
    QTabBar::resizeEvent(p_evt); 
    movePlusButton(); 
} 

void TabBar::tabLayoutChange(void) 
{ 
    QTabBar::tabLayoutChange(); 
    movePlusButton(); 
} 

私のヘッダーファイル:

#ifndef TABBAR_H 
#define TABBAR_H 

#include <QObject> 
#include <QToolButton> 
#include <QTabBar> 
#include <QResizeEvent> 
#include <QLabel> 

class TabBar : public QTabBar { 
Q_OBJECT 

public: 
    TabBar(QWidget *parent=nullptr); 
    ~TabBar() { } 

    void movePlusButton(void); 


    void resizeEvent(QResizeEvent *p_evt) override; 
    void tabLayoutChange(void) override; 
    QSize sizeHint(void) const override; 

private slots: 
    void emit_new(void); 

signals: 
    void newClicked(void); 

private: 
    QToolButton *new_button_; 
}; 

#endif // TABBAR_H 

はEDIT:

私はさらにいくつかの実験を試してみましたが、QToolButtonがタブに次の領域の後ろに隠れている知って持っていますバー。スクリーンショットを参照してください。

enter image description here

+0

コードのインデントを修正したい場合があります。 – tambre

+0

'' QHidget :: updateGeometry'(http://doc.qt.io/qt-5/qwidget.html#updateGeometry)を 'movePlusButton'の最後に' sizeHint'が持っていると期待していました影響を受けている。それ以外は明らかな問題は見当たりません。 'movePlusButton'の最後に' QTabBar'の 'rect()'と 'new_button_'の' geometry() 'を印字して、値がすべて意味を持つかどうかを確認してください。 –

+0

私はあなたが提案したことを試しましたが、うまくいきませんでした。あなたはそれを実行し、何が間違っているのを見てみることができますか? – abhiarora

答えて

3

どうやら、あなたのアプリケーションが表示をカスタマイズするためにスタイルシートか何かを使用しており、これはあなたのTabBarクラスと互換性がありません。

はあなたのコードをダウンロードし、メインのシンプルを書いた:

#include <QApplication> 
#include <QMainWindow> 
#include "tabbar.h" 

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

    QMainWindow wnd; 

    TabBar* tabBar = new TabBar(&wnd); 
    wnd.setCentralWidget(tabBar); 

    tabBar->addTab("Foo"); 

    wnd.show(); 

    return app.exec(); 
} 

コンパイルし、Windows上で実行し、(古典とエアロスタイルをテストした)ことを得た: enter image description here

だから明らかにあなたのコードは大丈夫です。しかし、QTabBarのスタイルシートを使ってレンダリングをカスタマイズした場合(あなたのGUIでどのように見えるのか疑わしい場合)、あなたのコードを適合させる必要があります。おそらくmovePlusButtonは現在の表示スタイルと互換性のない値):

if (totalWidth > w) 
    new_button_->move(w-40, tab_height - 30); 
else 
    new_button_->move(totalWidth + 5, tab_height - 30); 
+0

これまでに提案したことを試しましたが、うまくいきませんでした。 – abhiarora

+0

何を試しましたか?あなたのスタイルシートを無効にしましたか?私にとって、あなたの質問は間違って尋ねられます。 「使用しているスタイルシートを考慮してボタンを表示させる方法」を尋ねたはずです。スタイルシートを投稿してください...私はそれがあなたの問題の根本的な原因だと思っています。 – jpo38

+0

私はスタイルシートを削除し、提案したことを試しました。私はもう一度試してみて、あなたを更新します。 – abhiarora

関連する問題