Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: kambala от Март 08, 2013, 15:55



Название: [РЕШЕНО] виджет внутри QSplitter
Отправлено: kambala от Март 08, 2013, 15:55
Здравствуйте. Есть 2 виджета, разделенные сплиттером. Поступило предложение добавить 2 кнопки внутрь сплиттера (см. скрин). Возможно ли это реализовать?


Название: Re: виджет внутри QSplitter
Отправлено: Old от Март 08, 2013, 16:48
Сплитер обычный виджет, на который можно добавить другие виджеты.


Название: Re: виджет внутри QSplitter
Отправлено: kambala от Март 08, 2013, 16:57
не вижу кода работающего примера. вот такая банальщина работает так, как предполагает сплиттер, а не так, как обычный виджет:
Код
C++ (Qt)
QSplitter s;
QPushButton *b1 = new QPushButton("b1", &s), *b2 = new QPushButton("b2", &s);
s.show();


Название: Re: виджет внутри QSplitter
Отправлено: Bepec от Март 08, 2013, 17:05
Придётся скорее всего перехватывать у сплиттера евенты. У него ж активная область только его handle.


Название: Re: виджет внутри QSplitter
Отправлено: Old от Март 08, 2013, 17:06
не вижу кода работающего примера.
А он должен быть?
Посмотри исходники QSplitter, на нем есть виджеты, тот же QSplitterHandle. По аналогии можно добавить свои.
А можно рисовать кнопки самому.


Название: Re: виджет внутри QSplitter
Отправлено: kambala от Март 08, 2013, 20:10
спасибо, теперь всё понял. надо было просто почитать документацию по QSplitterHandle, а я искал в QSplitter.


Название: Re: виджет внутри QSplitter
Отправлено: kambala от Март 09, 2013, 16:14
пример использования:
Код
C++ (Qt)
#include <QtGui>
#include <QtCore>
 
#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
#include <QtWidgets/QtWidgets>
#endif
 
class SplitterHandle : public QSplitterHandle
{
public:
   SplitterHandle(Qt::Orientation orientation, QSplitter *parent) : QSplitterHandle(orientation, parent)
   {
       QPushButton *right = new QPushButton(QChar(0x2192), this);
       right->setCursor(Qt::ArrowCursor);
 
       QPushButton *left = new QPushButton(QChar(0x2190), this);
       left->setCursor(Qt::ArrowCursor);
 
       w = new QWidget(this);
       QVBoxLayout *layout = new QVBoxLayout(w);
       layout->addStretch();
       layout->addWidget(right);
       layout->addWidget(left);
       layout->addStretch();
   }
 
   QSize sizeHint() const { return QSize(w->width(), QSplitterHandle::sizeHint().height()); }
 
protected:
   void showEvent(QShowEvent *e) { w->resize(size()); }
 
private:
   QWidget *w;
};
 
class Splitter : public QSplitter
{
public:
   Splitter(Qt::Orientation orientation, QWidget *parent = 0) : QSplitter(orientation, parent) {}
 
protected:
   QSplitterHandle *createHandle() { return new SplitterHandle(orientation(), this); }
};
 
int main(int argc, char *argv[])
{
   QApplication app(argc, argv);
 
   Splitter splitter(Qt::Horizontal);
   QTextEdit *t1 = new QTextEdit(&splitter), *t2 = new QTextEdit(&splitter);
   splitter.show();
 
   return app.exec();
}