久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

如何確定 QTableWidget 的正確大小?

How to determine the correct size of a QTableWidget?(如何確定 QTableWidget 的正確大小?)
本文介紹了如何確定 QTableWidget 的正確大小?的處理方法,對(duì)大家解決問(wèn)題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧!

問(wèn)題描述

是否有任何方法來(lái)設(shè)置 QTableWidget 的正確"大小?(我是新手)這個(gè)測(cè)試代碼只有25行,分兩個(gè)文件,文件Test.h:

#include 類測(cè)試:公共 QMainWindow {Q_OBJECT民眾:測(cè)試();};

和文件Test.cpp:

#include "Test.h"測(cè)試::測(cè)試() : QMainWindow() {QVBoxLayout *vbox = 新的 QVBoxLayout;QPushButton *btn = new QPushButton("Hello World etc etc etc etc etc");QTableWidget *tbl = new QTableWidget(2, 2);vbox->addWidget(btn);vbox->addWidget(tbl);QWidget *w = 新的 QWidget;setCentralWidget(w);w->setLayout(vbox);調(diào)整大小(1, 1);}int main(int argc, char *argv[]) {QApplication app(argc, argv);測(cè)試一下;測(cè)試顯示();app.exec();}

然后是命令:

 qmake -project &&qmake &&制作&&./測(cè)試

給出窗口:

但我們想要的當(dāng)然更像是:

使用 tbl->width() 似乎沒(méi)用,因?yàn)樗?test.show() 之前給出了 640 的默認(rèn)值,以及之后的 195 不需要的值.我已經(jīng)查看了 Qt 大小提示和策略,直到我頭暈?zāi)垦#⑶覈L試了 setResizeMode(QHeaderView::Fixed)setStretchLastSection(false).也許我錯(cuò)過(guò)了一些明顯的東西?如果這很重要,這是在 CentOS 5 上的 Qt 4.7.4.感謝您的幫助.

Edit:響應(yīng)DK,ifresize(1, 1);不是目前,存在相等相反的問(wèn)題:窗口太大.

為了回應(yīng) Donotalo,補(bǔ)充說(shuō):

tbl->setMaximumWidth(222);tbl->setMinimumWidth(222);tbl->setMaximumHeight(88);tbl->setMinimumHeight(88);

將給出所需的窗口大小(至少在我的機(jī)器上),但不會(huì)以所需的方式.我們應(yīng)該如何計(jì)算常數(shù)"22288?

Ton 對(duì) .

更新 #3:

  • 這是我的最終版本——但我對(duì)它不是很滿意.非常歡迎任何改進(jìn).

  • adjustSize()layout()->invalidate()Qt::WA_DontShowOnScreen 之類的東西沒(méi)有似乎有幫助.

  • 博客 收縮將 Qt 小部件調(diào)整為所需的最小尺寸 很有趣,但使用 setSizeConstraint() 也一樣好.

  • setSizeConstraint()move() 方法是對(duì)表格的后續(xù)更改所必需的,此處未顯示.

  • 我在 CentOS 5 和 Qt 4.6.3 和 4.7.4 上進(jìn)行的測(cè)試中有一件奇怪的事情.對(duì)于 hide();show(); 序列,保存/恢復(fù)窗口位置.但是大約 25% 的時(shí)間(圖案不規(guī)則)恢復(fù)的位置在屏幕上 24 像素,大概是窗口標(biāo)題的高度.大約 10% 的時(shí)間 pos() 返回的值是 null.Qt 站點(diǎn) 說(shuō) X11 需要 漂亮的啟發(fā)式和聰明的代碼,但似乎某處壞了.

Is there any way to set the "correct" size of a QTableWidget? (I'm a newbie) This test code is only 25 lines long, in two files, with the file Test.h:

#include <QtGui>
class Test : public QMainWindow {
   Q_OBJECT
public:
   Test();
};

and the file Test.cpp:

#include "Test.h"
Test::Test() : QMainWindow() {
   QVBoxLayout *vbox = new QVBoxLayout;
   QPushButton  *btn = new QPushButton("Hello World etc etc etc etc etc");
   QTableWidget *tbl = new QTableWidget(2, 2);
   vbox->addWidget(btn);
   vbox->addWidget(tbl);
   QWidget *w = new QWidget;
   setCentralWidget(w);
   w->setLayout(vbox);
   resize(1, 1);
}

int main(int argc, char *argv[]) {
   QApplication app(argc, argv);
   Test test;
   test.show();
   app.exec();
}

Then the command:

   qmake -project && qmake && make && ./Test

gives the window:

But what we want of course is something more like:

Using tbl->width() seems to be useless, as it gives a default of 640 before test.show(), and the unwanted value of 195 after. I've looked at the Qt Size Hints and Policies until my head spun, and I've tried setResizeMode(QHeaderView::Fixed) and setStretchLastSection(false). Maybe I'm missing something obvious? This is with Qt 4.7.4 on CentOS 5, if this matters. Thank you for any help.

Edit: In response to DK, if the line resize(1, 1); is not present, there is the equal and opposite problem: the window is too large.

And in response to Donotalo, adding:

tbl->setMaximumWidth(222);
tbl->setMinimumWidth(222);
tbl->setMaximumHeight(88);
tbl->setMinimumHeight(88); 

will give the desired window size (at least on my machine), but not in the desired way. How should we calculate the 'constants' 222 and 88?

And Ton's answer to Qt: How to force a hidden widget to calculate its layout? doesn't seem to work here: the addition of tbl->setAttribute(Qt::WA_DontShowOnScreen); tbl->show(); left the value of tbl->width() unchanged at 640.

解決方案

The thread How to set a precise size of QTableWidget to prevent from having scroll bars? (Qt-interest Archive, June 2007) between Lingfa Yang and Susan Macchia seems to resolve my question. I will post more details shortly, if my testing works.

Update #1: My test now generates the nice-looking window:

The complete test code for this, with Test.h unchanged, is:

#include "Test.h"

static QSize myGetQTableWidgetSize(QTableWidget *t) {
   int w = t->verticalHeader()->width() + 4; // +4 seems to be needed
   for (int i = 0; i < t->columnCount(); i++)
      w += t->columnWidth(i); // seems to include gridline (on my machine)
   int h = t->horizontalHeader()->height() + 4;
   for (int i = 0; i < t->rowCount(); i++)
      h += t->rowHeight(i);
   return QSize(w, h);
}

static void myRedoGeometry(QWidget *w) {
   const bool vis = w->isVisible();
   const QPoint pos = w->pos();
   w->hide();
   w->show();
   w->setVisible(vis);
   if (vis && !pos.isNull())
      w->move(pos);
}

Test::Test() : QMainWindow() {
   QVBoxLayout *vbox = new QVBoxLayout;
   QPushButton *btn  = new QPushButton("Hello World etc etc etc etc etc");
   QTableWidget *tbl = new QTableWidget(2, 2);
   vbox->addWidget(btn);
   vbox->addWidget(tbl);
   setCentralWidget(new QWidget);
   centralWidget()->setLayout(vbox);
   layout()->setSizeConstraint(QLayout::SetMinimumSize); // or SetFixedSize

   tbl->setVerticalHeaderItem(1, new QTableWidgetItem("two")); // change size
   myRedoGeometry(this);
   tbl->setMaximumSize(myGetQTableWidgetSize(tbl));
   tbl->setMinimumSize(tbl->maximumSize()); // optional
}

int main(int argc, char *argv[]) {
   QApplication app(argc, argv);
   Test test;
   test.show();
   app.exec();
}

Some notes:

  • The above thread's inclusion of verticalScrollBar()->width() seems to be wrong. And, in my testing, this was always either a default value of 100, or the value 15, if the scrollbar had been displayed.

  • Applying the show(); hide(); sequence just to the QTableWidget was not sufficient to force Qt to recalculate the geometry, in this test. I needed to apply it to the whole window.

  • Any suggestions for improvements would be welome. (I'll wait a bit before accepting my own answer, in case there are better solutions.)

Update #2:

  • The Qt-interest thread may be wrong (or, at least, it disagrees with my version of Qt running my machine) regarding details on how to calculate the size: the +1 for each gridline is unnecessary, but an overall +4 is needed.

  • I'm still working through layout()->invalidate() vs. e.g. QT: How to preview sizes of widgets in layout BEFORE a show().

Update #3:

  • This is my final version--but I'm not very happy with it. Any improvements would be very welcome.

  • Things like adjustSize() and layout()->invalidate() and Qt::WA_DontShowOnScreen don't seem to help.

  • The blog Shrinking Qt widgets to minimum needed size is interesting, but using setSizeConstraint() is just as good.

  • The setSizeConstraint() and move() methods are needed for subsequent changes to the table, not shown here.

  • There was an odd thing in my testing, done on CentOS 5 with Qt 4.6.3 and 4.7.4. For the hide(); show(); sequence, the window position is saved/restored. But about 25% of the time (the patterning was irregular) the restored position would be 24 pixels higher on the screen, presumably the height of the window title. And about 10% of the time the value returned by pos() would be null. The Qt site says for X11 it needs nifty heuristics and clever code for this, but something seems to be broken somewhere.

這篇關(guān)于如何確定 QTableWidget 的正確大小?的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,也希望大家多多支持html5模板網(wǎng)!

【網(wǎng)站聲明】本站部分內(nèi)容來(lái)源于互聯(lián)網(wǎng),旨在幫助大家更快的解決問(wèn)題,如果有圖片或者內(nèi)容侵犯了您的權(quán)益,請(qǐng)聯(lián)系我們刪除處理,感謝您的支持!

相關(guān)文檔推薦

How can I read and manipulate CSV file data in C++?(如何在 C++ 中讀取和操作 CSV 文件數(shù)據(jù)?)
In C++ why can#39;t I write a for() loop like this: for( int i = 1, double i2 = 0; (在 C++ 中,為什么我不能像這樣編寫 for() 循環(huán): for( int i = 1, double i2 = 0;)
How does OpenMP handle nested loops?(OpenMP 如何處理嵌套循環(huán)?)
Reusing thread in loop c++(在循環(huán) C++ 中重用線程)
Precise thread sleep needed. Max 1ms error(需要精確的線程睡眠.最大 1ms 誤差)
Is there ever a need for a quot;do {...} while ( )quot; loop?(是否需要“do {...} while ()?環(huán)形?)
主站蜘蛛池模板: 日韩欧美在线视频 | 国产精品爱久久久久久久 | 91视视频在线观看入口直接观看 | 在线观看成人小视频 | 中文字幕在线视频一区二区三区 | 久久国产精品一区二区 | 中文字幕亚洲一区二区va在线 | 免费黄色片在线观看 | 国产色 | 精品成人在线视频 | 在线视频国产一区 | 国产精品免费看 | 亚洲一区二区在线 | 国产盗摄视频 | 女人牲交视频一级毛片 | 久久在视频 | www.亚洲一区 | 精品毛片在线观看 | 久久综合伊人 | 日韩激情视频一区 | 亚洲国产精品日本 | 91在线一区| 亚洲在线免费观看 | 日韩专区中文字幕 | 久久成人高清视频 | 亚洲人a | 亚洲一区二区三区免费视频 | 久久69精品久久久久久久电影好 | 亚洲视频中文字幕 | 免费在线看黄视频 | 一级毛片免费完整视频 | 91毛片在线看| 中文字幕亚洲欧美日韩在线不卡 | 亚洲精品在线视频 | 中文字幕国产视频 | 欧美一区二区视频 | 九九热这里只有精品在线观看 | 国产成人精品一区二区三区 | 欧美成年网站 | 亚洲国产一区视频 | 欧美8一10sex性hd |