Saya ingin membuat jendela yang dapat diubah ukurannya yang berisi beberapa ikon yang ukurannya disesuaikan dengan jendela. Saya membuat jendela dan menempatkan ikon dalam tata letak kotak, itu berfungsi seperti yang saya inginkan sejauh ini.

Tapi masalahnya adalah ketika saya mengecilkan jendela ke ukuran kecil, ikon terlalu kecil dan tidak bisa mengenali sama sekali. Jadi saya mengatur ukuran minimum ikon dan sepertinya menyelesaikan masalah pertama.

Sekarang, masalahnya adalah ikon tumpang tindih ketika saya mengecilkan jendela dan terlihat jelek.

Saya mencoba menggunakan spacer, margin widget, spasi tata letak, dan properti minimumRowHeight.

Tetapi Qt tampaknya ukuran jendela lebih diprioritaskan daripada ukuran atau margin minimum widget atau lainnya.

Semuanya menyusut dan masih tidak ada ruang sama sekali di antara widget.

Saya dapat mengatasi masalah ini dengan ukuran minimum jendela. Namun, diperlukan beberapa upaya untuk menentukan ukuran minimum yang terlihat paling baik.

Jadi pertanyaan saya adalah:

  1. Saya ingin tahu apakah ada margin (atau jarak) antara widget dalam tata letak yang tidak pernah menyusut. Jika ada, saya hanya menempatkan ikon saya dalam ukuran jendela yang besar dan mengatur margin yang tidak menyusut, sehingga ukuran minimum jendela dapat ditentukan sendiri.

  2. Jika tidak, apa cara terbaik untuk membuat apa yang saya inginkan? apakah itu ukuran jendela minimum? Jika demikian, bagaimana cara menentukan ukuran minimum terbaik?

Setiap saran atau dokumentasi akan sangat dihargai.

Menambahkan:

  1. Ini yang aku inginkan. Saya mengatur ketinggian minimum jendela ke 380px.

  1. Jika saya tidak mengatur ketinggian minimum, ikonnya tumpang tindih seperti di atas

  1. Saya mengubah ketinggian beberapa kali untuk menentukan ketinggian gambar pada 1, jika tingginya tidak cukup, ikon terlalu dekat seperti yang ditunjukkan

Berikut beberapa kode:

verticalLayout = new QVBoxLayout(widget); // window layout

labelTime = new QLabel(widget);
verticalLayout->addWidget(labelTime);

gridLayout1 = new QGridLayout(); // grid layout at top
gridLayout1->setSpacing(15);
labelIcon1 = new QLabel(widget);
labelIcon1 ->setMinimumSize(QSize(40, 40));
labelIcon1 ->setPixmap(QPixmap(path));
gridLayout1->addWidget(labelIcon1, 0, 0, 1, 1);

... // create icons and add to gridlayout1

verticalLayout->addLayout(gridLayout1);

line = new QFrame(widget);  // just line.
verticalLayout->addWidget(line); // add to vertical layout, not grid layout.

... // create grid layout, icons at bottom and add it to vertical layout, same as top

Struktur terlihat seperti ini: QLabel, QGridLayout, Line, QGridLayout2 ditempatkan dalam tata letak vertikal.

-------------vertical layout
[   text   ]
-------------grid layout
[icon][text]
[icon][text]
-------------grid layout
[   line   ]
-------------grid layout 2
[icon][text]
[icon][text]
[icon][text]
-------------grid layout 2
-------------vertical layout
qt
3
Dean Lee 5 Maret 2020, 17:23

1 menjawab

Jawaban Terbaik

Masalahnya adalah Anda telah menetapkan ukuran minimum untuk QLabel tetapi tidak untuk QPixmap, karena Anda ingin ikon mengubah ukuran berdasarkan ukuran jendela maka Anda dapat mengatur properti scaledContents dari QLabel menjadi true.

Di sisi lain saya akan merekomendasikan menggunakan QGridLayout untuk semua elemen sehingga keselarasan ikon akan dipertahankan, di bagian berikut ada contohnya:

#include <QtWidgets>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QWidget w;
    QGridLayout *layout = new QGridLayout(&w);

    QLabel *title = new QLabel("2020-01-01 00:00:00");
    title->setAlignment(Qt::AlignHCenter);
    layout->addWidget(title, 0, 0, 1, 2);

    QLabel *icon1 = new QLabel;
    icon1->setAlignment(Qt::AlignCenter);
    icon1->setPixmap(QPixmap(":/icon1.png"));
    icon1->setMinimumSize(40, 40);
    icon1->setScaledContents(true);
    layout->addWidget(icon1, 1, 0);
    QLabel *text1 = new QLabel("Disconnected");
    text1->setAlignment(Qt::AlignCenter);
    layout->addWidget(text1, 1, 1);

    QLabel *icon2 = new QLabel;
    icon2->setAlignment(Qt::AlignCenter);
    icon2->setPixmap(QPixmap(":/icon2.png"));
    icon2->setMinimumSize(40, 40);
    icon2->setScaledContents(true);
    layout->addWidget(icon2, 2, 0);
    QLabel *text2 = new QLabel("HDD 0%");
    text2->setAlignment(Qt::AlignCenter);
    layout->addWidget(text2, 2, 1);

    QFrame *line = new QFrame;
    line->setFrameShape(QFrame::HLine);
    line->setFrameShadow(QFrame::Sunken);
    layout->addWidget(line, 3, 0, 1, 2);

    QLabel *icon3 = new QLabel;
    icon3->setAlignment(Qt::AlignCenter);
    icon3->setPixmap(QPixmap(":/icon3.png"));
    icon3->setMinimumSize(40, 40);
    icon3->setScaledContents(true);
    layout->addWidget(icon3, 4, 0);
    QLabel *text3 = new QLabel("0");
    text3->setAlignment(Qt::AlignCenter);
    layout->addWidget(text3, 4, 1);

    QLabel *icon4 = new QLabel;
    icon4->setAlignment(Qt::AlignCenter);
    icon4->setPixmap(QPixmap(":/icon4.png"));
    icon4->setMinimumSize(40, 40);
    icon4->setScaledContents(true);
    layout->addWidget(icon4, 5, 0);
    QLabel *text4 = new QLabel("0 ( 0% )");
    text4->setAlignment(Qt::AlignCenter);
    layout->addWidget(text4, 5, 1);

    QLabel *icon5 = new QLabel;
    icon5->setAlignment(Qt::AlignCenter);
    icon5->setPixmap(QPixmap(":/icon5.png"));
    icon5->setMinimumSize(40, 40);
    icon5->setScaledContents(true);
    layout->addWidget(icon5, 6, 0);
    QLabel *text5 = new QLabel("0 ( 0% )");
    text5->setAlignment(Qt::AlignCenter);
    layout->addWidget(text5, 6, 1);

    w.show();
    return a.exec();
}

enter image description here

Jika Anda ingin mengubah spasi antara baris, kolom atau keduanya, maka Anda harus menggunakan layout->setVerticalSpacing(spacing), layout->setHorizontalSpacing(spacing) dan layout->setSpacing(spacing), masing-masing.

2
eyllanesc 6 Maret 2020, 04:02