Как добавить кнопку в угол виджета в QT? - PullRequest
1 голос
/ 21 февраля 2012

Я пытаюсь отобразить квадратное изображение, и в правом верхнем углу есть крестик (половина изображения наполовину снаружи), чтобы закрыть изображение.Я не знаю менеджера по расположению, который позволил бы мне сделать это.Как мне это реализовать?

+---------O <- close button
|         |
|         |
+---------+

1 Ответ

3 голосов
/ 22 февраля 2012

Здесь будет много чего реализовать.Я выполнил это следующим образом:

Шаг 1. Подкласс QLabel, позволяющий захватывать щелчки мыши.В заголовке объявите сигналы Clicked и 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. Добавьте LabelButton с именем xbutton, содержащую круглое изображение «x», в ваш виджет в нужном вам месте.

Пример (это будет в вашей функции 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. Создайте свой виджет.Установите прозрачный фон и убедитесь, что его размер включает пространство для кнопки закрытия «х».Примечание. Установка прозрачного фона означает, что ваш виджет должен будет содержать некоторый дочерний виджет, который принимает ввод от пользователя.

Пример:

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());
    }
}

Я нашел этот способ наиболее полезным для меня,потому что мне нужно было много функциональности из моего настраиваемого скользкого виджета.

Мне очень нравятся креативные пользовательские интерфейсы, и я надеюсь, что когда вы закончите, ваш внешний вид будет действительно гладким!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...