Russian Qt Forum
Май 04, 2024, 17:47 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: 1 ... 106 107 [108] 109 110 ... 122
1606  Qt / Пользовательский интерфейс (GUI) / Re: QPushButton::setChecked() и вызов меню : Февраль 17, 2013, 21:31
Решил воспользоваться советом GreatSnake, и реализовать через QToolButton.
1607  Qt / Пользовательский интерфейс (GUI) / Re: QPushButton::setChecked() и вызов меню : Февраль 17, 2013, 15:50
Верес, покажите что нужно исправить в алгоритме?
1608  Qt / Пользовательский интерфейс (GUI) / Re: QPushButton::setChecked() и вызов меню : Февраль 17, 2013, 01:10
Минимально компилируемый код:

h:
Код:
class UDropDownMenu: public QWidget
{
    Q_OBJECT

public:
    UDropDownMenu(QWidget *parent = 0)
    {
        setWindowFlags(Qt::Popup);

        gridLayout = new QGridLayout();

        setLayout(gridLayout);
    }

private:
    QGridLayout *gridLayout;

signals:
    void iHide();

protected:
    void paintEvent(QPaintEvent *event)
    {
        QWidget::paintEvent(event);

        QPainter painter(this);

        QPen pen;
        pen.setWidth(2);
        painter.setPen(pen);

        painter.drawRect(rect());
    }

    void hideEvent(QHideEvent *)
    {
        emit iHide();
    }
};

class UComboBoxButton: public QWidget
{
    Q_OBJECT   

public:
    UComboBoxButton(QWidget *parent = 0);

private:
    void createGUI();

private:
    QPushButton *pButtonShowHideDropDownMenu;
    UDropDownMenu *dropDownMenu;

public slots:
    void showPopup();

private slots:
    void dropDownMenuHide();
};

cpp:
Код:
/// PUBLIC
UComboBoxButton::UComboBoxButton(QWidget *parent)
    : QWidget(parent)
{
    createGUI();
}

/// PRIVATE
void UComboBoxButton::createGUI()
{
    QHBoxLayout *hBoxLayoutMain = new QHBoxLayout();

    dropDownMenu = new UDropDownMenu();
    connect(dropDownMenu, SIGNAL(iHide()),
            this, SLOT(dropDownMenuHide()));

    pButtonShowHideDropDownMenu = new QPushButton();
    pButtonShowHideDropDownMenu->setCheckable(true);
    pButtonShowHideDropDownMenu->setFixedSize(20, 20);

    connect(pButtonShowHideDropDownMenu, SIGNAL(clicked()),
            this, SLOT(showPopup()));

    hBoxLayoutMain->addWidget(pButtonShowHideDropDownMenu);
    hBoxLayoutMain->setSpacing(0);

    setLayout(hBoxLayoutMain);
}

/// PUBLIC SLOTS
void UComboBoxButton::showPopup()
{
    QPushButton *pButton = pButtonShowHideDropDownMenu;   

    QPoint pos = pButton->mapToGlobal(QPoint(0,
                                                  pButton->height()));

    dropDownMenu->move(pos);

    bool checked = pButton->isChecked();
    dropDownMenu->setVisible(checked);
}

/// PRIVATE SLOTS
void UComboBoxButton::dropDownMenuHide()
{
    QPushButton *pButton = pButtonShowHideDropDownMenu;
    pButton->setChecked(false);
}
1609  Qt / Пользовательский интерфейс (GUI) / Re: QPushButton::setChecked() и вызов меню : Февраль 17, 2013, 00:56
слот поставил на сигнал clicked()
1610  Qt / Пользовательский интерфейс (GUI) / QPushButton::setChecked() и вызов меню : Февраль 17, 2013, 00:50
Здравствуйте!
Помогите разобраться и доделать Улыбающийся

Задание:
Создать кнопку. При нажатии на нее она помечается (checked = true) и появляется меню.
Меню и функцию его появления сделать самому. При повторном нажатии на кнопку, меню исчезает и исчезает метка на кнопке (checked = false). Меню также исчезает, если оно теряет фокус. Если у меню нет фокуса, метка с кнопки также исчезает.


В общем, сделал почти все, вот только проблемка возникла.

Нажатие на кнопку вызывает этот слот:
Код:
void showPopup()
{
    bool checked = pButtonShowHideDropDownMenu->isChecked();

    QPoint pos = pButtonShowHideDropDownMenu->mapToGlobal(QPoint(0,
                                                  pButtonApply->height()));
    dropDownMenu->move(pos);

    dropDownMenu->setVisible(checked);
}
т.е. получаем состояние кнопки (checked) и взависимости от него показываем/прячем наш виджет-меню с флагом Qt::Popup

Осталось сделать так чтобы, при исчезновении меню кнопка перестала быть помеченной.

Переопределил я у виджета-меню событие исчезновения (hideEvent()), в нем добавил генерацию сигнала. Когда сигнал отлавливается, вызывается слот с строкой:
Код:
pButtonShowHideDropDownMenu->setChecked(false);

Теперь нажатие на кнопку, вызывает меню, а повторное нажатие, прячет и снова его показывает
Если убрать строку
Код:
pButtonShowHideDropDownMenu->setChecked(false);
, то такого безобразия нет

Как сделать такое же поведение кнопки как и в QComboBox?

Спасибо Улыбающийся
1611  Qt / Пользовательский интерфейс (GUI) / Re: Как ограничить посимвольно количество текста в QTextEdit и QPlainTextEdit ? : Февраль 12, 2013, 12:33
Пожалуйста Улыбающийся
1612  Qt / Пользовательский интерфейс (GUI) / Re: Как ограничить посимвольно количество текста в QTextEdit и QPlainTextEdit ? : Февраль 11, 2013, 14:16
А самому нельзя контролировать?)
Например, отлавливаем сигнал textChanged(),
сравниваем текущее количество символов через toPlainText().count(),
а дальше "кастрируем" textedit как захотим Улыбающийся

впрочем, немного погуглив нашел такое Улыбающийся:
http://www.prog.org.ru/topic_14661_0.html
http://www.cyberforum.ru/qt/thread762962.html
1613  Qt / Общие вопросы / Re: Как узнать системный шрифт? : Февраль 08, 2013, 00:25
Не уж то никто не знает? Улыбающийся
1614  Qt / 2D и 3D графика / Re: Запись всего, что видно на экране, в картинку : Февраль 07, 2013, 14:39
http://doc.qt.digia.com/stable/desktop-screenshot.html

Использовать QPixmap::grabWindow() для захвата картинки определенного окна или виджета на окне

Использовать QPixmap::save() дабы сохранить то что на pixmap

Не это ли вам надо? Улыбающийся
1615  Qt / Пользовательский интерфейс (GUI) / Re: Создание области выделения : Февраль 03, 2013, 23:28
да не за что Улыбающийся
1616  Qt / Пользовательский интерфейс (GUI) / Re: Создание области выделения : Февраль 03, 2013, 21:48
насчет стандартных сомневаюсь)
делал похожее, еще когда только-только изучал Qt и дорабатывал скриншотер из примеров)

h:
Код:
/*
 Этот класс наследуется от QWidget
 создает окно без рамки
 окно на весь экран и прозрачно на половину
 на этом окне можно выделять область
 при нажатии пробела, виджет подает сигнал и закрывается

 связываю этот класс с классом ScreenShot
 когда поступает сигнал, класс ScreenShot его отлавливает и
 получает координаты выделенной области, после чего делает по
 ним скриншот области экрана
 */
class SelectedArea: public QWidget
{
    Q_OBJECT

public:
    int x0, y0, x1, y1;
    QRect rectSelectedArea;
    bool mousePress;

public:
    SelectedArea(QWidget * parent = 0);

signals:
    void areaIsSelected(void);
    void windowClose(void);

protected:
    void paintEvent(QPaintEvent *);
    void keyReleaseEvent(QKeyEvent *event);
    void mousePressEvent(QMouseEvent *event);
    void mouseReleaseEvent(QMouseEvent *event);
    void mouseMoveEvent(QMouseEvent *event);
    void closeEvent(QCloseEvent *);
};

cpp:
Код:
SelectedArea::SelectedArea(QWidget * parent)
{
    setWindowFlags(Qt::FramelessWindowHint);
    setWindowOpacity(0.5);

    setGeometry(QApplication::desktop()->geometry());
    mousePress = false;
    x0 = 0;
    y0 = 0;
    x1 = 0;
    y1 = 0;
}

void SelectedArea::paintEvent(QPaintEvent *)
{
    QPainter painter(this);

    painter.setBrush(Qt::black);
    painter.setPen(Qt::black);
    painter.drawRect(rect());

    QPen pen;
    pen.setColor(Qt::white);
    pen.setStyle(Qt::DashLine);
    painter.setPen(pen);
    painter.setBrush(QColor(100, 100, 100));
    painter.drawRect(x0, y0, x1-x0, y1-y0);

    QString textHint;
    textHint = tr("Для снимка нажмите SPACE, ENTER или среднюю кнопку мыши");
    textHint+= tr("\n");
    textHint+= tr("Для закрытия нажмите ESCAPE, Alt+F4, или правую кнопку мыши");

    QFont font;
    font.setPixelSize(30);

    painter.setFont(font);
    painter.setPen(Qt::white);

    painter.drawText(rect(), Qt::AlignCenter, textHint);
}
void SelectedArea:: keyReleaseEvent(QKeyEvent *event)
{
    if(event->key() == Qt::Key_Escape)
    {
        close();
    }
    if(event->key() == Qt::Key_Space || event->key() == Qt::Key_Return)
    {
        if(x0 > x1)
        {
            int temp = x0;
            x0 = x1;
            x1 = temp;
        }

        if(y0 > y1)
        {
            int temp = y0;
            y0 = y1;
            y1 = temp;
        }


        close();
        emit areaIsSelected();
    }
}
void SelectedArea:: mousePressEvent(QMouseEvent *event)
{
    if(event->button() == Qt::LeftButton)
    {
        mousePress = true;
        x0 = event->x();
        y0 = event->y();

        setCursor(QCursor(Qt::CrossCursor));
    }
    if(event->button() == Qt::RightButton)
    {
        close();
    }
}
void SelectedArea:: mouseReleaseEvent(QMouseEvent *event)
{
    mousePress = false;
    setCursor(QCursor(Qt::ArrowCursor));

    if(event->button() == Qt::MiddleButton)
    {
        close();
        emit areaIsSelected();
    }
}
void SelectedArea:: mouseMoveEvent(QMouseEvent *event)
{
    if(mousePress)
    {
        x1 = event->x();
        y1 = event->y();
        update();
    }
}

void SelectedArea:: closeEvent(QCloseEvent *)
{
    emit windowClose();
}
1617  Qt / Общие вопросы / Как узнать системный шрифт? : Январь 30, 2013, 21:27
Нужно узнать средствами Qt какой шрифт используется в ОС  Улыбающийся

Спасибо за внимание! Улыбающийся
1618  Qt / Model-View (MV) / Re: QJsonArray --> QTable : Январь 24, 2013, 03:32
Пример переопределения оператора сравнения для целого числа:
Код:
class UIntTableWidgetItem: public QTableWidgetItem
{
protected:
    virtual bool operator < (const QTableWidgetItem & other) const
    {
        qint32 a = text().toInt();
        qint32 b = other.text().toInt();
        return a < b;
    }
};

может быть это поможет Подмигивающий
1619  Qt / Вопросы новичков / Re: Подключение сигналов/слотов : Январь 14, 2013, 16:19
Использование сигналов/слотов возможно при соблюдении двух условий:
1) наследование от класса QObject
2) написание в private класса Q_OBJECT
1620  Qt / Общие вопросы / Re: Получить собственные данные из QSettings : Январь 11, 2013, 23:07
Если ваш класс не имеет неограниченное количество значений, которые нужно записывать, то стоит в QSettings записывать именно это значения Улыбающийся
если что, QSettings может и массивы записывать/считывать Подмигивающий
Страниц: 1 ... 106 107 [108] 109 110 ... 122

Страница сгенерирована за 0.059 секунд. Запросов: 23.