2010-03-30 12 views

Trả lời

25

Kể từ khi QSplitterHandle (đó là những gì hầu hết mọi người nghĩ đến là 'splitter') có nguồn gốc từ QWidget, bạn có thể thêm các widget khác để nó . Dưới đây là những gì tôi đã làm để giải quyết vấn đề chính xác này trong quá khứ:

// Now add the line to the splitter handle 
// Note: index 0 handle is always hidden, index 1 is between the two widgets 
QSplitterHandle *handle = pSplitter->handle(1); 
QVBoxLayout *layout = new QVBoxLayout(handle); 
layout->setSpacing(0); 
layout->setMargin(0); 

QFrame *line = new QFrame(handle); 
line->setFrameShape(QFrame::HLine); 
line->setFrameShadow(QFrame::Sunken); 
layout->addWidget(line); 

Điều này thêm một dòng bị chìm vào tay cầm bộ chia. Bạn có thể, tất nhiên, chọn một phong cách cho khung line hoặc sử dụng một cái gì đó hoàn toàn khác nhau như các widget bạn thêm vào xử lý splitter.

+0

Cảm ơn bạn rất nhiều :)! – Narek

+0

Điều này thật tuyệt vời. Tôi sẽ chỉ thêm rằng tôi thích một QHBoxLayout vì sau đó tôi có thể gán một 'maxWidth' (cho splitter ngang) vào đường ngang. – Phlucious

+0

Được thăng hạng bởi vì nó hoạt động, nhưng nó thực sự cảm thấy giống như một cách giải quyết vụng về cho một lỗi Qt ... –

7

Điều này đúng đối với mọi bộ tách ít nhất với WinXP và Luna mặc định (thay đổi thành giải quyết vấn đề cổ điển). Nếu bạn muốn ở lại với Luna, bạn có thể thay đổi cách trình tách được hiển thị, ví dụ: bằng cách thay đổi màu nền của tay cầm.

int main(int argc, char *argv[]) { 

    QApplication a(argc, argv); 
    a.setStyleSheet("QSplitter::handle { background-color: gray }"); 
    MainWindow w; 
    w.show(); 
    return a.exec(); 
} 

Bạn có thể tìm hiểu thêm về style sheets Qt tại https://doc.qt.io/qt-5/stylesheet-reference.html

+0

Cảm ơn. Điều này thay đổi màu sắc nhưng tôi muốn thay đổi giảm phát splitter. Điều đó có thể không? – Narek

+0

Hành vi mặc định của bộ chia nhỏ trong cửa sổ là vẽ màu nền. Điều này là xấu khi các thành phần chia nhỏ có bg-màu quá theo mặc định (QWidget). Cách cửa sổ là để cho họ một màu sắc khác nhau và/hoặc một biên giới chìm (QFrame hỗ trợ biên giới). Nếu bạn muốn sử dụng cứu trợ, bạn phải thay đổi phong cách (quên bảng định kiểu). Sử dụng setStyle() để thay đổi kiểu. Phù điêu được hỗ trợ, ví dụ: bởi QPlastiqueStyle. Bạn có thể áp dụng setStyle() cho đối tượng QApplication hoặc chỉ cho bộ tách (không được ưu tiên). Tôi sẽ đề xuất giải pháp gốc được đề cập trước. – merula

+0

Bạn có thể ghi đè lên QSplitter :: createHandle() để trả về xử lý với bản vẽ tùy chỉnh –

8

Tôi dựa trên mã ở trên nhưng nó xử lý cả hai định hướng splitter. Tôi chỉ ưa thích những người không thay đổi kích thước không bị mờ và không thể thu gọn. Nắm giữ bao gồm ba đường song song. Bạn có thể chơi với chiều rộng xử lý, nhưng nắm giữ ở 7 có vẻ tốt trên Windows; chưa kiểm tra trong Linux hoặc Mac.

void helper::decorateSplitter(QSplitter* splitter, int index) 
{ 
    Q_ASSERT(splitter != NULL); 

    const int gripLength = 15; 
    const int gripWidth = 1; 
    const int grips = 3; 

    splitter->setOpaqueResize(false); 
    splitter->setChildrenCollapsible(false); 

    splitter->setHandleWidth(7); 
    QSplitterHandle* handle = splitter->handle(index); 
    Qt::Orientation orientation = splitter->orientation(); 
    QHBoxLayout* layout = new QHBoxLayout(handle); 
    layout->setSpacing(0); 
    layout->setMargin(0); 

    if (orientation == Qt::Horizontal) 
    { 
     for (int i=0;i<grips;++i) 
     { 
      QFrame* line = new QFrame(handle); 
      line->setMinimumSize(gripWidth, gripLength); 
      line->setMaximumSize(gripWidth, gripLength); 
      line->setFrameShape(QFrame::StyledPanel); 
      layout->addWidget(line); 
     } 
    } 
    else 
    { 
     //this will center the vertical grip 
     //add a horizontal spacer 
     layout->addStretch(); 
     //create the vertical grip 
     QVBoxLayout* vbox = new QVBoxLayout; 
     for (int i=0;i<grips;++i) 
     { 
      QFrame* line = new QFrame(handle); 
      line->setMinimumSize(gripLength, gripWidth); 
      line->setMaximumSize(gripLength, gripWidth); 
      line->setFrameShape(QFrame::StyledPanel); 
      vbox->addWidget(line); 
     } 
     layout->addLayout(vbox); 
     //add another horizontal spacer 
     layout->addStretch(); 
    } 
} 
+0

Có lẽ giải pháp tốt nhất ở đây ngay cả khi sử dụng Qt5.6. Cảm ơn! – Plouff

+0

Đã phải đặt 'gripWidth = 2' để có thể nhìn thấy thấu kính (giao diện Win7 cổ điển).Nếu không thì giải pháp tốt đẹp cho một vấn đề cần được khắc phục trong Qt năm trước. – DerManu

0

Bạn có thể phân lớp QSplitter và ghi đè protected virtual QSplitterHandle * QSplitter::createHandle() để trả lại bất kỳ điều gì khiến bạn hài lòng.

Ví dụ: từ phương thức quá tải đó, bạn có thể trả lại lớp con của QSplitterHandle bằng bản vẽ tùy chỉnh.

-1

Nhờ câu trả lời của Merula ... Tôi đã thử điều này và bây giờ các splitter của tôi có thể nhìn thấy và trông rất đẹp mà không cần nhìn khó chịu. Mã này dành cho Python sử dụng PyQt hoặc PySide.

app = QtGui.QApplication(sys.argv) 
app.setStyle("Plastique") # set style (using this style shows splitters! :) 
+0

ngôn ngữ này là gì? Điều này không giống như C++ –

+0

oops .. xin lỗi này là python sử dụng pyqt hoặc pyside – panofish

Các vấn đề liên quan