3

「StyledPanel、隆起」フレームを持つ QLabel があります。
QLabel をサブクラス化することにより、クリック可能です。

class InteractiveLabel(QtGui.QLabel):
    def __init__(self, parent):  
        QtGui.QLabel.__init__(self, parent)

    def mouseReleaseEvent(self, event):  
        self.emit(QtCore.SIGNAL('clicked()'))

ただし、一般的な意見では、この「ボックス」はクリック可能であると認識されにくいというものです。
使いやすさを向上させるために、「ボックス」の上にマウスを置いたときにクリック可能であることを示したいと思います。
明らかに、マウス ホバーへの反応は、mouseHoverEvent を接続することで簡単に実現できます。

ただし、私のQtアプリケーションではユーザーがスタイルを変更できるため(Windows XP、Windows 7、plastique、motif、cdeから)、「ボタンインジケーター」はネイティブに継承する必要があります。

この画像は、特定のウィジェット (右下隅) と、私が望む mouseHover の美学を 2 つの異なるスタイルで示しています。

プラスチック スタイルと Win7 スタイルの「ボックス」とホバー インジケーターを示す画像

マウスが「ボックス」の上に置かれたとき、コンボボックスが上部、中央にあるように応答したいと思います。
(「応答」は美的にネイティブであり、「CDE」および「モチーフ」スタイルを除くすべての Qt ボタンで発生します。)

これを PyQt4 で実装する方法はありますか?
(非ネイティブ ソリューションには、QGradient とネイティブ スタイルのチェックが含まれると思いますが、それは厄介です。)

更新:
QPushButton 上の QLabel の lol4t0 のアイデア。

これは、シグナルが適切に機能し、適切なボタンの美学をすべて備えた私のpythonic実装です。RichTextBox は、プログラムに埋め込むウィジェットです。

from PyQt4 import QtCore, QtGui

class RichTextButton(QtGui.QPushButton):
    def __init__(self, parent=None):  
        QtGui.QPushButton.__init__(self, parent)
        self.UnitText = QtGui.QLabel(self)
        self.UnitText.setTextInteractionFlags(QtCore.Qt.NoTextInteraction)
        self.UnitText.setAlignment(QtCore.Qt.AlignCenter)
        self.UnitText.setMouseTracking(False)
        self.setLayout(QtGui.QVBoxLayout())
        self.layout().setMargin(0)
        self.layout().addWidget(self.UnitText)

ありがとう!


仕様:
- python 2.7.2
- Windows 7
- PyQt4

4

2 に答える 2

5

本旨

QLabel上に追加してQPushButtonQLabelの子にするQPushButton)、ラベルにリッチテキストを表示できますが、クリックと装飾は次のように処理できますQPushButton

実験

ええと、私はC++プログラマーですが、複雑なことは何もありません。コードを理解していただければ幸いです。

  • 主なアイデアの実装:

    QLabel * label = new QLabel(pushButton);
    label->setText("<strong>sss</strong>");
    label->setAlignment(Qt::AlignCenter);
    label->setMouseTracking(false);
    pushButton->setLayout(new QVBoxLayout(pushButton));
    pushButton->layout()->setMargin(0);
    pushButton->layout()->addWidget(label);
    

    そして、これはほとんど機能します!唯一のばかげたバグ (または私の全体的な誤解) は、マウスでボタンを押して離すと、ボタンが押されたままになることです。

- したがって、常に押される問題を修正するには、再実装mouseReleaseEventする必要があるようです。label

もう少しエレガントな解決策があると確信していますが、今それを見つけるのが面倒なので、次のようにしました。

    class TransperentLabel: public QLabel
    {
    public:
        TransperentLabel(QWidget* parent):QLabel(parent) {}
    protected:
        void mouseReleaseEvent(QMouseEvent *ev)
        {
            /*
            QApplication::sendEvent(parent(), ev); -- does not help :(
            */
            static_cast<QPushButton*>(parent())->setDown(false);
            static_cast<QPushButton*>(parent())->click(); //fixing click signal issues
        }
    };

  • @Rokuが言ったように、その問題を修正するには、追加する必要があります

    label->setTextInteractionFlags(Qt::NoTextInteraction);
    
于 2012-01-22T10:56:18.880 に答える
3

@ Lol4t0、私はあなたの方法にいくつかの改善があります...

これは私のヘッダーファイルです:

#ifndef QLABELEDPUSHBUTTON_H
#define QLABELEDPUSHBUTTON_H

#include <QPushButton>

class QLabel;

class QLabeledPushButton : public QPushButton
{
    Q_OBJECT

    QLabel * m_label;

public:
    QLabeledPushButton(QWidget * parent = 0);

    QString text() const;
    void setText(const QString & text);

protected:
    void resizeEvent(QResizeEvent * event);
};

#endif // QLABELEDPUSHBUTTON_H

そして、私のcppファイルがあります:

#include <QLabel>
#include <QVBoxLayout>
#include <QResizeEvent>
#include "QLabeledPushButton.h"

QLabeledPushButton::QLabeledPushButton(QWidget * parent)
    : QPushButton(parent)
    , m_label(new QLabel(this))
{
    m_label->setWordWrap(true);
    m_label->setMouseTracking(false);
    m_label->setAlignment(Qt::AlignCenter);
    m_label->setTextInteractionFlags(Qt::NoTextInteraction);
    m_label->setGeometry(QRect(4, 4, width()-8, height()-8));
}

QString QLabeledPushButton::text() const
{
    return m_label->text();
}

void QLabeledPushButton::setText(const QString & text)
{
    m_label->setText(text);
}

void QLabeledPushButton::resizeEvent(QResizeEvent * event)
{
    if (width()-8 < m_label->sizeHint().width())
        setMinimumWidth(event->oldSize().width());
    if (height()-8 < m_label->sizeHint().height())
        setMinimumHeight(event->oldSize().height());

    m_label->setGeometry(QRect(4, 4, width()-8, height()-8));
}

したがって、QLabel のテキストは常に表示されます。QPushButton を小さすぎてテキストの一部を隠すことはできません。こちらの方が使いやすいと思います。...

于 2012-06-02T08:09:06.437 に答える