2017-08-18 13 views
0

質問

カスタムウィジェットでは、QGridLayoutのボタンを接続する線(QPainterを使用)を描きたいと思います。線A)B Qtで行の後ろにボタンを描くには?

  • 間にボタンを妨げない

    • するために、ボタンの後ろでなければならない)がボタンの中心ではなく、縁

    の行を起動可能this questionのアイデアを考えれば、私はGUIアプリケーション(以下のソースコード)で動作するシンプルで基本的なバージョンをほとんど実現することができました。

    限り、私は、標準のQtスタイルでQPushButtonを使用して、それは魔法のように動作し(左)、しかし、私はカスタムスタイルを使用すると、行は(右)重なっ:

    Qt style buttonsCustom style buttons

    この現象を引き起こすのはどのプロパティまたはメカニズムですか?


    コード

    MyFrame.h:

    #include <QFrame> 
    
    class MyFrame : public QFrame 
    { 
    public: 
        MyFrame(); 
        virtual ~MyFrame() = default; 
    }; 
    

    MyFrame.cpp:

    #include "MyFrame.h" 
    
    #include "LineDrawWidget.h" 
    
    #include <QVBoxLayout> 
    #include <QGridLayout> 
    #include <QPushButton> 
    #include <QButtonGroup> 
    
    MyFrame::MyFrame() 
    { 
        auto* mainLayout = new QVBoxLayout(this); 
        auto* buttonLayout = new QGridLayout(); 
    
        QPushButton* button; 
        auto* buttons = new QButtonGroup(); 
        for (int i = 0; i < 3; ++i) { 
         button = new QPushButton(); 
         button->setText(QString::number(i+1)); 
         button->setFixedHeight(40); 
         button->setFixedWidth(40); 
         button->setStyleSheet("QPushButton { color : black; background-color : white; }"); 
         button->setStyleSheet("QPushButton { border-style : outset; border-color: black; border-width: 2px; border-radius: 6px; }"); 
         buttonLayout->addWidget(button); 
         buttons->addButton(button, i); 
        } 
    
        auto* lineDraw = new LineDrawWidget(
          buttons->button(0), 
          buttons->button(2)); 
        lineDraw->setLayout(buttonLayout); 
        mainLayout->addWidget(lineDraw); 
    } 
    

    LineDrawWidget.h:

    #include <QWidget> 
    
    class LineDrawWidget : public QWidget 
    { 
    public: 
        LineDrawWidget(
          QWidget* from, 
          QWidget* to, 
          QWidget* parent = nullptr); 
        virtual ~LineDrawWidget() = default; 
    
    protected: 
        virtual void paintEvent(QPaintEvent* e) final override; 
    
    private: 
        QWidget* _from; 
        QWidget* _to; 
    }; 
    

    LineDrawWidget.cpp:

    #include "LineDrawWidget.h" 
    
    #include <QPainter> 
    
    LineDrawWidget::LineDrawWidget(
         QWidget* from, 
         QWidget* to, 
         QWidget* parent) : 
         QWidget(parent), 
         _from(from), 
         _to(to) 
    { 
    
    } 
    
    void LineDrawWidget::paintEvent(QPaintEvent* e) 
    { 
        (void)e; 
    
        QPainter painter(this); 
    
        QPoint start = _from->mapToGlobal(_from->rect().bottomLeft()); 
        QPoint end = _to->mapToGlobal(_to->rect().topRight()); 
        painter.drawLine(mapFromGlobal(start), mapFromGlobal(end)); 
    } 
    
    +0

    直接関連しない: '(void)e;'の代わりに 'Q_UNUSED(e);'が読みやすくなります。 – Azeem

    +0

    @Azeemは入力をありがとう、まだこのことを知らなかった。 – bunto1

    +0

    あなたは大歓迎です! :)参照してください:[Q_UNUSED](http://doc.qt.io/qt-5/qtglobal.html#Q_UNUSED) – Azeem

    答えて

    1

    私はこの問題は、単一のQPushButtonためsetStyleには2つの別々の呼び出しだと思う - 2番目の呼び出しは、その中に存在しないすべてのプロパティをリセットするために表示されます。 1回の呼び出しですべてを入れてみてください...

    button->setStyleSheet("color : black; background-color : white; border-style : outset; border-color: black; border-width: 2px; border-radius: 6px;"); 
    

    私のために働くようです。

    +0

    それが取得するように簡単です..私のためにも同様に動作します、ありがとう! – bunto1

    関連する問題