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); }
|
|
|
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? Спасибо
|
|
|
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(); }
|
|
|
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; } };
может быть это поможет
|
|
|
|
|