私は正方形の画像を表示しようとしており、画像を閉じるために右上隅(画像の半分の外側の半分)にXがあります。私はそれをすることができるレイアウトマネージャーを知らない。これをどのように実装すればよいですか?QTのウィジェットの隅にボタンを追加するにはどうすればよいですか?
+---------O <- close button | | | | +---------+
私は正方形の画像を表示しようとしており、画像を閉じるために右上隅(画像の半分の外側の半分)にXがあります。私はそれをすることができるレイアウトマネージャーを知らない。これをどのように実装すればよいですか?QTのウィジェットの隅にボタンを追加するにはどうすればよいですか?
+---------O <- close button | | | | +---------+
ここに実装することがたくさんあります。
ステップ1.マウスクリックをキャプチャできるようにQLabelをサブクラス化します。ヘッダーでは、Clicked and Pressedを宣言し、適切なマウスイベントを無効にします。
LabelButton::LabelButton(QWidget *parent) : QLabel(parent)
{
}
void LabelButton::mouseReleaseEvent(QMouseEvent *event){
emit Clicked();
event->accept();
}
void LabelButton::mousePressEvent(QMouseEvent *event){
emit Pressed();
event->accept();
}
ステップ2.円形の「x」イメージを含むxbuttonというLabelButtonを希望の場所にウィジェットに追加します。
例(これは、あなたのsetupUi機能になります):
...
xbutton = new LabelButton(MainWidget);
xbutton->setObjectName(QString::fromUtf8("xbutton"));
xbutton->setGeometry(QRect(0, 0, 31, 31));
xbutton->setPixmap(QPixmap(QString::fromUtf8(":/xbutton.gif")));
xbutton->setAlignment(Qt::AlignCenter);
...
ステップ3.あなたのウィジェットを作成します。バックグラウンドを透明に設定し、そのサイズに「x」クローズボタンのスペースが含まれていることを確認します。注:背景を透明に設定すると、ウィジェットには、ユーザーからの入力を受け付ける子ウィジェットが含まれている必要があります。
例:
mywidget::mywidget(QWidget *parent): QWidget(parent){
setupUi(this);
moving=false; // notice that you must declare this bool for Step 4.
offset=QPoint(0,0); // Also a QPoint for Step 4
#if defined(Q_WS_MAC) //These values worked for me with the Mac OS 10.5 SDK
this->setWindowFlags(Qt::CustomizeWindowHint | Qt::WindowStaysOnTopHint | Qt::Window);
QPalette pal = this->palette();
pal.setColor(this->backgroundRole(), Qt::transparent);
this->setPalette(pal);
#elif defined(Q_WS_WIN)//These values worked for me on Windows XP/Vista/7
this->setWindowFlags(Qt::CustomizeWindowHint | Qt::WindowStaysOnTopHint |Qt::FramelessWindowHint | Qt::Window);
setStyleSheet("background:transparent;");
setAttribute(Qt::WA_TranslucentBackground);
#endif
connect(xbutton,SIGNAL(Clicked()),this,SLOT(hide()));
}
今、あなたは、あなたが最初に所望の機能性を持っています。 xボタンをクリックすると、ウィンドウが閉じます。しかし、それを実装するまでは、通常の移動機能はありません。
ステップ4.ウィジェットに移動機能を実装します。
/*
FUNCTION:mousePressEvent
used to help move the widget since there is no title bar, sets the initial offset of the mouse
*/
void mywidget::mousePressEvent(QMouseEvent *event){
if((event->button() == Qt::LeftButton)) {
moving = true;
offset = event->globalPos() - this->pos();
}
}
/*
FUNCTION:mouseReleaseEvent
used to help move the widget since there is no title bar, releases the "moving" attribute
*/
void mywidget::mouseReleaseEvent(QMouseEvent *event){
if(event->button() == Qt::LeftButton) {
moving = false;
}
}
/*
FUNCTION:mouseMoveEvent
used to help move the widget since there is no title bar
*/
void mywidget::mouseMoveEvent(QMouseEvent *event){
if(moving){
QPoint global = event->globalPos();
this->setGeometry(global.x()-offset.x(),global.y()-offset.y(),this->width(),this->height());
}
}
私はカスタマイズされた滑らかな見栄えのウィジェットのうち、機能の多くを必要とするので、私は、私に最大限活用するためには、この方法を見つけました。
私はクリエイティブなユーザーインターフェイスを本当に楽しんでいます。完成したら、あなたの見た目は本当に洗練されたものになることを祈っています!
ロジックにぶつかると、次のようなことが起こります。ベースイメージのサイズ+ Xイメージのサイズの半分のボーダーレスキャンバスを作成します。ベース画像を左下に配置します。右上のベースイメージの上にXイメージを配置します。 –