crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Помогите с написанием собственного виджета., новичку
Dronte
  опции профиля:
сообщение 30.7.2011, 12:31
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 10
Регистрация: 30.7.2011
Пользователь №: 2770

Спасибо сказали: 0 раз(а)




Репутация:   0  


Вобщем суть в том, что нужен виджет, который отображает + или - и изменяет то что он показывает по нажатию по нему мышкой.

Я попробовал создать наследника QLabel c переопределенным mousePressEvent, это работает, но выглядит ужасно, вокруг + или - огромное пустое пространство.

Как это исправить? Или лучше использовать другой способ создания виджета? Расскажите в подробностях, или дайте ссылку пожалуйста? Я недавно начал изучать Qt.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 30.7.2011, 13:10
Сообщение #2


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Создайте обычную кнопку и на нее повесьте "+".
По нажатии меняйте на "-".

Если нужно что было как лейбл -смотрите свойство Flat.

void MainWindow::on_pushButton_clicked()
{
if (pushButton->text()=="-")
pushButton->setText("+");
else
pushButton->setText("-");
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ilyabvt
  опции профиля:
сообщение 30.7.2011, 15:47
Сообщение #3


Активный участник
***

Группа: Участник
Сообщений: 297
Регистрация: 23.6.2011
Пользователь №: 2765

Спасибо сказали: 45 раз(а)




Репутация:   3  


Немножко уточню. Если поставить свойство Flat, то при нажатии будет видно что это кнопка. Лучше, на мой взгляд, поставить стиль с помощью функции setStyleSheet().
pushButton->setStyleSheet( "QPushButton#pushButton { border: none; }" );
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Dronte
  опции профиля:
сообщение 30.7.2011, 21:53
Сообщение #4


Студент
*

Группа: Новичок
Сообщений: 10
Регистрация: 30.7.2011
Пользователь №: 2770

Спасибо сказали: 0 раз(а)




Репутация:   0  


Спасибо за советы, но оказалось что это моя глупость - я создал наследника QLabel внутри которого у меня был QLabel который менялся.

С QPushButton не получилось сделать так, чтоб это красиво выглядело.

Но с моим решением есть проблема - при первом изменении - на + размер прыгает. Как это исправить?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ilyabvt
  опции профиля:
сообщение 31.7.2011, 9:33
Сообщение #5


Активный участник
***

Группа: Участник
Сообщений: 297
Регистрация: 23.6.2011
Пользователь №: 2765

Спасибо сказали: 45 раз(а)




Репутация:   3  


QLabel понимает html теги, можно их использовать для задания размера.
Цитата
С QPushButton не получилось сделать так, чтоб это красиво выглядело.

Если не секрет, что конкретно вы хотите сделать такого красивого?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 31.7.2011, 9:48
Сообщение #6


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Dronte @ 31.7.2011, 0:53) *
при первом изменении - на + размер прыгает. Как это исправить?
приведи код своего виджета
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Dronte
  опции профиля:
сообщение 31.7.2011, 12:16
Сообщение #7


Студент
*

Группа: Новичок
Сообщений: 10
Регистрация: 30.7.2011
Пользователь №: 2770

Спасибо сказали: 0 раз(а)




Репутация:   0  


.h
Раскрывающийся текст

class AnswerWidget : public QLabel{
Q_OBJECT
public:
   AnswerWidget(QWidget * parent=0);
    void mousePressEvent(QMouseEvent * event);
    void block();
    void unblock();
    bool result();
    void setResult(bool);
private:
    bool blocked;
    bool textIsPlus;
};


.cpp
Раскрывающийся текст

AnswerWidget::AnswerWidget(QWidget * parent):QLabel(parent){
    setText("-");
    textIsPlus=0;
    blocked=0;
    show();
};

void AnswerWidget::mousePressEvent(QMouseEvent * ){
    if(!blocked){
    setResult(!textIsPlus);
    };
};

void AnswerWidget::block(){
    blocked=1;
};

void AnswerWidget::unblock(){
    blocked=0;
};
void AnswerWidget::setResult(bool result){
    if(result){
        setText("+");
        textIsPlus=1;
    }else{
        setText("-");
        textIsPlus=0;
    };
};

bool AnswerWidget::result(){
    return textIsPlus;
};
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


6 чел. читают эту тему (гостей: 6, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 22.12.2024, 17:42